42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/rockauto_api/endpoints/part_search.rb', line 42
def search_parts_by_number(part_number, manufacturer: nil, part_group: nil, part_type: nil, part_name: nil, include_fitments: false)
man_value = ""
group_value = ""
type_value = ""
if manufacturer
mans = get_manufacturers
match = mans.lookup(manufacturer)
man_value = match&.value || ""
end
if part_group
groups = get_part_groups
match = groups.lookup(part_group)
group_value = match&.value || ""
end
if part_type
types = get_part_types
match = types.lookup(part_type)
type_value = match&.value || ""
end
init_session!
page_resp = @conn.get("/en/partsearch/")
nck = Parsers::HtmlHelpers.(page_resp.body)
form_data = {
"_nck" => nck || "",
"_jnck" => @jnck_token || "",
"dopartsearch" => "1",
"partsearch[partnum][partsearch_007]" => part_number,
"partsearch[manufacturer][partsearch_007]" => man_value,
"partsearch[partgroup][partsearch_007]" => group_value,
"partsearch[parttype][partsearch_007]" => type_value,
"partsearch[partname][partsearch_007]" => part_name || "",
"partsearch[do][partsearch_007]" => "Search",
"func" => "sendparttabsearch",
"payload" => "{}",
"api_json_request" => "1",
"sctchecked" => "1",
"scbeenloaded" => "false",
"curCartGroupID" => ""
}
resp = Faraday.new(url: "https://www.rockauto.com") do |f|
f.request :url_encoded
f.use :cookie_jar
f.adapter Faraday.default_adapter
f.options.timeout = RockautoApi.configuration&.request_timeout || 30
f.["X-Requested-With"] = "XMLHttpRequest"
f.["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"
f.["User-Agent"] = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1"
f.["Referer"] = "https://www.rockauto.com/en/partsearch/"
@conn.["Cookie"].to_s.split(";").each do |cookie|
name, val = cookie.strip.split("=", 2)
f.["Cookie"] = "#{f.['Cookie']}; #{name}=#{val}" if name && val
end
end.post("catalog/catalogapi.php", form_data)
response = JSON.parse(resp.body)
parts = parse_part_search_json(response)
parts = parts.map do |p|
attrs = p.to_h
if include_fitments && attrs[:listing_data]
attrs[:buyers_guide] = get_fitment_for_part(attrs[:listing_data])
end
Models::PartInfo.new(**attrs)
end
Models::PartSearchResult.new(
parts: parts,
count: parts.size,
search_term: part_number,
manufacturer: manufacturer || "All",
part_group: part_group || "All"
)
rescue Faraday::Error => e
raise NetworkError, "Part search failed: #{e.message}"
end
|