thordata-js-sdk 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +55 -349
- package/dist/examples/basic_scraper_task.js +37 -24
- package/dist/examples/basic_scraper_task.js.map +1 -1
- package/dist/examples/basic_serp.js +3 -3
- package/dist/examples/basic_serp.js.map +1 -1
- package/dist/examples/location_api.js +47 -0
- package/dist/examples/location_api.js.map +1 -0
- package/dist/examples/proxy_datacenter.js +1 -1
- package/dist/examples/proxy_datacenter.js.map +1 -1
- package/dist/examples/proxy_isp.js +1 -1
- package/dist/examples/proxy_isp.js.map +1 -1
- package/dist/examples/proxy_mobile.js +1 -1
- package/dist/examples/proxy_mobile.js.map +1 -1
- package/dist/examples/proxy_residential.js +2 -2
- package/dist/examples/proxy_residential.js.map +1 -1
- package/dist/examples/serp_google_news.d.ts +0 -6
- package/dist/examples/serp_google_news.js +7 -10
- package/dist/examples/serp_google_news.js.map +1 -1
- package/dist/examples/verify_new_features.js +135 -0
- package/dist/examples/verify_new_features.js.map +1 -0
- package/dist/src/auth.d.ts +22 -0
- package/dist/src/auth.js +39 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/client.d.ts +144 -6
- package/dist/src/client.js +396 -43
- package/dist/src/client.js.map +1 -1
- package/dist/src/endpoints.js +2 -2
- package/dist/src/endpoints.js.map +1 -1
- package/dist/src/enums.d.ts +219 -3
- package/dist/src/enums.js +289 -2
- package/dist/src/enums.js.map +1 -1
- package/dist/src/errors.d.ts +37 -5
- package/dist/src/errors.js +61 -17
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +7 -5
- package/dist/src/index.js +21 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/models.d.ts +196 -12
- package/dist/src/models.js +1 -0
- package/dist/src/models.js.map +1 -1
- package/dist/src/proxy.d.ts +59 -0
- package/dist/src/proxy.js +83 -11
- package/dist/src/proxy.js.map +1 -1
- package/dist/src/retry.d.ts +25 -3
- package/dist/src/retry.js +16 -0
- package/dist/src/retry.js.map +1 -1
- package/dist/src/thordata.d.ts +5 -2
- package/dist/src/thordata.js +36 -6
- package/dist/src/thordata.js.map +1 -1
- package/dist/src/utils.d.ts +18 -13
- package/dist/src/utils.js +94 -43
- package/dist/src/utils.js.map +1 -1
- package/package.json +6 -6
- package/dist/examples/proxy_demo.js +0 -69
- package/dist/examples/proxy_demo.js.map +0 -1
- package/dist/examples/proxy_ip_check.js +0 -37
- package/dist/examples/proxy_ip_check.js.map +0 -1
- /package/dist/examples/{proxy_demo.d.ts → location_api.d.ts} +0 -0
- /package/dist/examples/{proxy_ip_check.d.ts → verify_new_features.d.ts} +0 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// examples/location_api.ts
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
import { Thordata } from "../src/thordata.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
if (!process.env.THORDATA_PUBLIC_TOKEN || !process.env.THORDATA_PUBLIC_KEY) {
|
|
6
|
+
console.log("Location API Demo - Skipped");
|
|
7
|
+
console.log("Set THORDATA_PUBLIC_TOKEN and THORDATA_PUBLIC_KEY in .env");
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const client = new Thordata();
|
|
11
|
+
console.log("Location API Demo\n");
|
|
12
|
+
// List countries (now using string parameter)
|
|
13
|
+
console.log("1. Listing countries...");
|
|
14
|
+
const countries = await client.listCountries("residential");
|
|
15
|
+
console.log(` Found ${countries.length} countries`);
|
|
16
|
+
console.log(` First 5: ${countries
|
|
17
|
+
.slice(0, 5)
|
|
18
|
+
.map((c) => c.country_code)
|
|
19
|
+
.join(", ")}`);
|
|
20
|
+
// List states for US
|
|
21
|
+
console.log("\n2. Listing US states...");
|
|
22
|
+
const states = await client.listStates("US", "residential");
|
|
23
|
+
console.log(` Found ${states.length} states`);
|
|
24
|
+
console.log(` First 5: ${states
|
|
25
|
+
.slice(0, 5)
|
|
26
|
+
.map((s) => s.state_name)
|
|
27
|
+
.join(", ")}`);
|
|
28
|
+
// List cities for California
|
|
29
|
+
console.log("\n3. Listing California cities...");
|
|
30
|
+
const cities = await client.listCities("US", "california", "residential");
|
|
31
|
+
console.log(` Found ${cities.length} cities`);
|
|
32
|
+
console.log(` First 5: ${cities
|
|
33
|
+
.slice(0, 5)
|
|
34
|
+
.map((c) => c.city_name)
|
|
35
|
+
.join(", ")}`);
|
|
36
|
+
// List ASNs for US
|
|
37
|
+
console.log("\n4. Listing US ASNs...");
|
|
38
|
+
const asns = await client.listAsns("US", "residential");
|
|
39
|
+
console.log(` Found ${asns.length} ASNs`);
|
|
40
|
+
console.log(` First 3: ${asns
|
|
41
|
+
.slice(0, 3)
|
|
42
|
+
.map((a) => `${a.asn_code}: ${a.asn_name}`)
|
|
43
|
+
.join(", ")}`);
|
|
44
|
+
console.log("\nLocation API demo completed.");
|
|
45
|
+
}
|
|
46
|
+
main().catch(console.error);
|
|
47
|
+
//# sourceMappingURL=location_api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location_api.js","sourceRoot":"","sources":["../../examples/location_api.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEnC,8CAA8C;IAC9C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CACT,eAAe,SAAS;SACrB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CACT,eAAe,MAAM;SAClB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,6BAA6B;IAC7B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CACT,eAAe,MAAM;SAClB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SACvB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,mBAAmB;IACnB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CACT,eAAe,IAAI;SAChB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;SAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -11,7 +11,7 @@ async function main() {
|
|
|
11
11
|
const testUrl = "http://httpbin.org/ip";
|
|
12
12
|
console.log("Datacenter Proxy Demo\n");
|
|
13
13
|
const proxy = Thordata.Proxy.datacenterFromEnv();
|
|
14
|
-
const result = await client.request(testUrl, { proxy });
|
|
14
|
+
const result = (await client.request(testUrl, { proxy }));
|
|
15
15
|
console.log("Datacenter IP:", result.origin);
|
|
16
16
|
}
|
|
17
17
|
main().catch(console.error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy_datacenter.js","sourceRoot":"","sources":["../../examples/proxy_datacenter.ts"],"names":[],"mappings":"AAAA,+BAA+B;
|
|
1
|
+
{"version":3,"file":"proxy_datacenter.js","sourceRoot":"","sources":["../../examples/proxy_datacenter.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -13,7 +13,7 @@ async function main() {
|
|
|
13
13
|
const testUrl = "http://httpbin.org/ip";
|
|
14
14
|
console.log("Static ISP Proxy Demo\n");
|
|
15
15
|
const proxy = Thordata.Proxy.ispFromEnv();
|
|
16
|
-
const result = await client.request(testUrl, { proxy });
|
|
16
|
+
const result = (await client.request(testUrl, { proxy }));
|
|
17
17
|
console.log("Static ISP IP:", result.origin);
|
|
18
18
|
console.log("Expected IP :", process.env.THORDATA_ISP_HOST);
|
|
19
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy_isp.js","sourceRoot":"","sources":["../../examples/proxy_isp.ts"],"names":[],"mappings":"AAAA,wBAAwB;
|
|
1
|
+
{"version":3,"file":"proxy_isp.js","sourceRoot":"","sources":["../../examples/proxy_isp.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAExB,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,KAAK,UAAU,IAAI;IACjB,IACE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC9B,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAClC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAClC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC/D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -11,7 +11,7 @@ async function main() {
|
|
|
11
11
|
const testUrl = "http://httpbin.org/ip";
|
|
12
12
|
console.log("Mobile Proxy Demo\n");
|
|
13
13
|
const proxy = Thordata.Proxy.mobileFromEnv().country("gb");
|
|
14
|
-
const result = await client.request(testUrl, { proxy });
|
|
14
|
+
const result = (await client.request(testUrl, { proxy }));
|
|
15
15
|
console.log("UK Mobile IP:", result.origin);
|
|
16
16
|
}
|
|
17
17
|
main().catch(console.error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy_mobile.js","sourceRoot":"","sources":["../../examples/proxy_mobile.ts"],"names":[],"mappings":"AAAA,2BAA2B;
|
|
1
|
+
{"version":3,"file":"proxy_mobile.js","sourceRoot":"","sources":["../../examples/proxy_mobile.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -12,7 +12,7 @@ async function main() {
|
|
|
12
12
|
console.log("Residential Proxy Demo\n");
|
|
13
13
|
// Basic usage
|
|
14
14
|
const proxy1 = Thordata.Proxy.residentialFromEnv().country("us");
|
|
15
|
-
const r1 = await client.request(testUrl, { proxy: proxy1 });
|
|
15
|
+
const r1 = (await client.request(testUrl, { proxy: proxy1 }));
|
|
16
16
|
console.log("US Residential IP:", r1.origin);
|
|
17
17
|
// With sticky session
|
|
18
18
|
const proxy2 = Thordata.Proxy.residentialFromEnv()
|
|
@@ -20,7 +20,7 @@ async function main() {
|
|
|
20
20
|
.city("tokyo")
|
|
21
21
|
.session("my_session")
|
|
22
22
|
.sticky(30);
|
|
23
|
-
const r2 = await client.request(testUrl, { proxy: proxy2 });
|
|
23
|
+
const r2 = (await client.request(testUrl, { proxy: proxy2 }));
|
|
24
24
|
console.log("Tokyo Sticky IP :", r2.origin);
|
|
25
25
|
}
|
|
26
26
|
main().catch(console.error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy_residential.js","sourceRoot":"","sources":["../../examples/proxy_residential.ts"],"names":[],"mappings":"AAAA,gCAAgC;
|
|
1
|
+
{"version":3,"file":"proxy_residential.js","sourceRoot":"","sources":["../../examples/proxy_residential.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExC,cAAc;IACd,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAoB,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAE7C,sBAAsB;IACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE;SAC/C,OAAO,CAAC,IAAI,CAAC;SACb,IAAI,CAAC,OAAO,CAAC;SACb,OAAO,CAAC,YAAY,CAAC;SACrB,MAAM,CAAC,EAAE,CAAC,CAAC;IACd,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAoB,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* SERP Google News Demo
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* npx ts-node examples/serp_google_news.ts
|
|
6
|
-
*/
|
|
1
|
+
// examples/serp_google_news.ts
|
|
7
2
|
import "dotenv/config";
|
|
8
3
|
import { ThordataClient, Engine } from "../src/index.js";
|
|
9
4
|
async function main() {
|
|
@@ -29,7 +24,8 @@ async function main() {
|
|
|
29
24
|
printNewsResults(results);
|
|
30
25
|
}
|
|
31
26
|
catch (e) {
|
|
32
|
-
|
|
27
|
+
const error = e;
|
|
28
|
+
console.error("❌ Search failed:", error.message);
|
|
33
29
|
}
|
|
34
30
|
// 2. Advanced News Filters
|
|
35
31
|
console.log("\n📰 2. Advanced Filters (Sort by Date)");
|
|
@@ -40,16 +36,17 @@ async function main() {
|
|
|
40
36
|
country: "us",
|
|
41
37
|
language: "en",
|
|
42
38
|
num: 5,
|
|
43
|
-
so: 1,
|
|
39
|
+
so: 1,
|
|
44
40
|
});
|
|
45
41
|
printNewsResults(results);
|
|
46
42
|
}
|
|
47
43
|
catch (e) {
|
|
48
|
-
|
|
44
|
+
const error = e;
|
|
45
|
+
console.error("❌ Advanced search failed:", error.message);
|
|
49
46
|
}
|
|
50
47
|
}
|
|
51
48
|
function printNewsResults(results) {
|
|
52
|
-
const news = results?.news ?? [];
|
|
49
|
+
const news = (results?.news ?? []);
|
|
53
50
|
console.log(`✅ Found ${news.length} news items:`);
|
|
54
51
|
news.slice(0, 5).forEach((item) => {
|
|
55
52
|
console.log(` ${item.rank}. [${item.source}] ${item.title}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serp_google_news.js","sourceRoot":"","sources":["../../examples/serp_google_news.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"serp_google_news.js","sourceRoot":"","sources":["../../examples/serp_google_news.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACtC,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,CAAC;SACP,CAAC,CAAC;QACH,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,CAAU,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACtC,KAAK,EAAE,yBAAyB;YAChC,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,CAAC;YACN,EAAE,EAAE,CAAC;SACN,CAAC,CAAC;QACH,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,CAAU,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAUD,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAe,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;IAElD,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// examples/verify_new_features.ts
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
import { ThordataClient } from "../src/index.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const testName = args[0] || "all";
|
|
7
|
+
const scraperToken = process.env.THORDATA_SCRAPER_TOKEN;
|
|
8
|
+
const publicToken = process.env.THORDATA_PUBLIC_TOKEN;
|
|
9
|
+
const publicKey = process.env.THORDATA_PUBLIC_KEY;
|
|
10
|
+
const sign = process.env.THORDATA_SIGN || publicToken;
|
|
11
|
+
const apiKey = process.env.THORDATA_API_KEY || publicKey;
|
|
12
|
+
if (!scraperToken) {
|
|
13
|
+
console.error("❌ THORDATA_SCRAPER_TOKEN required");
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const client = new ThordataClient({
|
|
17
|
+
scraperToken,
|
|
18
|
+
publicToken,
|
|
19
|
+
publicKey,
|
|
20
|
+
sign, // Public API NEW
|
|
21
|
+
apiKey, // Public API NEW
|
|
22
|
+
});
|
|
23
|
+
console.log("========================================");
|
|
24
|
+
console.log("Thordata SDK - New Features Verification");
|
|
25
|
+
console.log("========================================");
|
|
26
|
+
const tests = {
|
|
27
|
+
video_task: async () => {
|
|
28
|
+
console.log("\n--- Testing: Video Task Creation ---");
|
|
29
|
+
try {
|
|
30
|
+
const taskId = await client.createVideoTask({
|
|
31
|
+
fileName: "test_{{VideoID}}",
|
|
32
|
+
spiderId: "youtube_video_by-url",
|
|
33
|
+
spiderName: "youtube.com",
|
|
34
|
+
parameters: { url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ" },
|
|
35
|
+
commonSettings: { resolution: "720p", is_subtitles: "false" },
|
|
36
|
+
});
|
|
37
|
+
console.log(`✅ Video task created: ${taskId}`);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
console.log(`❌ Failed: ${e.message}`);
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
usage_stats: async () => {
|
|
46
|
+
console.log("\n--- Testing: Usage Statistics ---");
|
|
47
|
+
try {
|
|
48
|
+
const now = new Date();
|
|
49
|
+
const weekAgo = new Date(now.getTime() - 7 * 24 * 3600 * 1000);
|
|
50
|
+
const fmt = (d) => d.toISOString().split("T")[0];
|
|
51
|
+
const stats = await client.getUsageStatistics(fmt(weekAgo), fmt(now));
|
|
52
|
+
console.log(`✅ Stats Retrieved:`);
|
|
53
|
+
console.log(` Balance: ${(stats.traffic_balance / 1024 ** 3).toFixed(2)} GB`);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
console.log(`❌ Failed: ${e.message}`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
proxy_users: async () => {
|
|
62
|
+
console.log("\n--- Testing: Proxy Users ---");
|
|
63
|
+
try {
|
|
64
|
+
const users = await client.listProxyUsers("residential");
|
|
65
|
+
console.log(`✅ Users Retrieved: ${users.user_count}`);
|
|
66
|
+
if (users.list.length > 0) {
|
|
67
|
+
console.log(` User 1: ${users.list[0].username}`);
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
console.log(`❌ Failed: ${e.message}`);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
proxy_servers: async () => {
|
|
77
|
+
console.log("\n--- Testing: Proxy Servers (ISP) ---");
|
|
78
|
+
try {
|
|
79
|
+
const servers = await client.listProxyServers(1); // 1 = ISP
|
|
80
|
+
console.log(`✅ ISP Servers: ${servers.length}`);
|
|
81
|
+
if (servers.length > 0) {
|
|
82
|
+
console.log(` Server 1: ${servers[0].ip}:${servers[0].port}`);
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
console.log(`❌ Failed: ${e.message}`);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
api_new_balance: async () => {
|
|
92
|
+
console.log("\n--- Testing: API NEW - Balance ---");
|
|
93
|
+
try {
|
|
94
|
+
const res = await client.getResidentialBalance();
|
|
95
|
+
console.log(`✅ Balance: ${(res.balance / 1024 ** 3).toFixed(2)} GB`);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
console.log(`❌ Failed: ${e.message}`);
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
api_new_isp: async () => {
|
|
104
|
+
console.log("\n--- Testing: API NEW - ISP Regions ---");
|
|
105
|
+
try {
|
|
106
|
+
const regions = await client.getIspRegions();
|
|
107
|
+
console.log(`✅ Regions: ${regions.length}`);
|
|
108
|
+
if (regions.length > 0) {
|
|
109
|
+
const r = regions[0];
|
|
110
|
+
console.log(` ${r.country}/${r.city}: ${r.num} IPs`);
|
|
111
|
+
}
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
console.log(`❌ Failed: ${e.message}`);
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
let passed = 0;
|
|
121
|
+
let total = 0;
|
|
122
|
+
for (const [name, fn] of Object.entries(tests)) {
|
|
123
|
+
if (testName === "all" || testName === name) {
|
|
124
|
+
total++;
|
|
125
|
+
if (await fn())
|
|
126
|
+
passed++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
console.log("\n========================================");
|
|
130
|
+
console.log(`Summary: ${passed}/${total} passed`);
|
|
131
|
+
console.log("========================================");
|
|
132
|
+
process.exit(passed === total ? 0 : 1);
|
|
133
|
+
}
|
|
134
|
+
main().catch(console.error);
|
|
135
|
+
//# sourceMappingURL=verify_new_features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify_new_features.js","sourceRoot":"","sources":["../../examples/verify_new_features.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type Headers = Record<string, string>;
|
|
2
|
+
export interface Credentials {
|
|
3
|
+
scraperToken: string;
|
|
4
|
+
publicToken?: string;
|
|
5
|
+
publicKey?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build headers for SERP/Universal scraping APIs.
|
|
9
|
+
* Docs require a `token` header (Account Settings token).
|
|
10
|
+
* Some docs/examples also use `Authorization: Bearer ...`, so we send both for compatibility.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildScraperHeaders(creds: Credentials): Headers;
|
|
13
|
+
/**
|
|
14
|
+
* Build headers for Public APIs (Web Scraper task status/download/list, etc.).
|
|
15
|
+
* These APIs require `token` + `key` from Dashboard -> My Account.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildPublicHeaders(creds: Credentials): Headers;
|
|
18
|
+
/**
|
|
19
|
+
* Build headers for Web Scraper builder endpoint.
|
|
20
|
+
* Interface docs require `token` + `key` (My Account) AND `Authorization: Bearer ...` (scraper token).
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildBuilderHeaders(creds: Credentials): Headers;
|
package/dist/src/auth.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// src/auth.ts
|
|
2
|
+
/**
|
|
3
|
+
* Build headers for SERP/Universal scraping APIs.
|
|
4
|
+
* Docs require a `token` header (Account Settings token).
|
|
5
|
+
* Some docs/examples also use `Authorization: Bearer ...`, so we send both for compatibility.
|
|
6
|
+
*/
|
|
7
|
+
export function buildScraperHeaders(creds) {
|
|
8
|
+
if (!creds.scraperToken) {
|
|
9
|
+
throw new Error("scraperToken is required");
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
token: creds.scraperToken,
|
|
13
|
+
Authorization: `Bearer ${creds.scraperToken}`,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build headers for Public APIs (Web Scraper task status/download/list, etc.).
|
|
18
|
+
* These APIs require `token` + `key` from Dashboard -> My Account.
|
|
19
|
+
*/
|
|
20
|
+
export function buildPublicHeaders(creds) {
|
|
21
|
+
if (!creds.publicToken || !creds.publicKey) {
|
|
22
|
+
throw new Error("publicToken and publicKey are required");
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
token: creds.publicToken,
|
|
26
|
+
key: creds.publicKey,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build headers for Web Scraper builder endpoint.
|
|
31
|
+
* Interface docs require `token` + `key` (My Account) AND `Authorization: Bearer ...` (scraper token).
|
|
32
|
+
*/
|
|
33
|
+
export function buildBuilderHeaders(creds) {
|
|
34
|
+
return {
|
|
35
|
+
...buildPublicHeaders(creds),
|
|
36
|
+
Authorization: `Bearer ${creds.scraperToken}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA,cAAc;AAUd;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,YAAY;QACzB,aAAa,EAAE,UAAU,KAAK,CAAC,YAAY,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACnD,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,WAAW;QACxB,GAAG,EAAE,KAAK,CAAC,SAAS;KACrB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,OAAO;QACL,GAAG,kBAAkB,CAAC,KAAK,CAAC;QAC5B,aAAa,EAAE,UAAU,KAAK,CAAC,YAAY,EAAE;KAC9C,CAAC;AACJ,CAAC"}
|
package/dist/src/client.d.ts
CHANGED
|
@@ -1,19 +1,44 @@
|
|
|
1
|
-
import { SerpOptions, UniversalOptions, ScraperTaskOptions, WaitForTaskOptions } from "./models.js";
|
|
1
|
+
import { SerpOptions, UniversalOptions, ScraperTaskOptions, WaitForTaskOptions, ProxyTypeParam, CountryInfo, StateInfo, CityInfo, AsnInfo, VideoTaskOptions, UsageStatistics, ProxyUserList, ProxyServer } from "./models.js";
|
|
2
2
|
import { type ThordataBaseUrls } from "./endpoints.js";
|
|
3
3
|
import { Proxy } from "./proxy.js";
|
|
4
|
+
/**
|
|
5
|
+
* Configuration options for ThordataClient.
|
|
6
|
+
*/
|
|
4
7
|
export interface ThordataClientConfig {
|
|
8
|
+
/** API token for SERP and Universal APIs */
|
|
5
9
|
scraperToken: string;
|
|
10
|
+
/** Public token for Web Scraper API and Location API */
|
|
6
11
|
publicToken?: string;
|
|
12
|
+
/** Public key for Web Scraper API and Location API */
|
|
7
13
|
publicKey?: string;
|
|
14
|
+
/** Request timeout in milliseconds (default: 30000) */
|
|
15
|
+
sign?: string;
|
|
16
|
+
/** Sign for Public API NEW (optional, falls back to publicToken) */
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
/** API Key for Public API NEW (optional, falls back to publicKey) */
|
|
8
19
|
timeoutMs?: number;
|
|
20
|
+
/** Maximum number of retries on failure (default: 0) */
|
|
9
21
|
maxRetries?: number;
|
|
22
|
+
/** Custom base URLs for API endpoints */
|
|
10
23
|
baseUrls?: Partial<ThordataBaseUrls>;
|
|
24
|
+
/** Custom User-Agent string */
|
|
11
25
|
userAgent?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Whether to verify SSL certificates (default: true).
|
|
28
|
+
* Set to false only for testing with self-signed certificates.
|
|
29
|
+
*/
|
|
30
|
+
verifySsl?: boolean;
|
|
12
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Main client for interacting with Thordata APIs.
|
|
34
|
+
*/
|
|
13
35
|
export declare class ThordataClient {
|
|
14
36
|
private scraperToken;
|
|
15
37
|
private publicToken?;
|
|
16
38
|
private publicKey?;
|
|
39
|
+
private sign?;
|
|
40
|
+
private apiKey?;
|
|
41
|
+
private gatewayBaseUrl;
|
|
17
42
|
private timeoutMs;
|
|
18
43
|
private maxRetries;
|
|
19
44
|
private http;
|
|
@@ -24,21 +49,134 @@ export declare class ThordataClient {
|
|
|
24
49
|
private scraperBuilderUrl;
|
|
25
50
|
private scraperStatusUrl;
|
|
26
51
|
private scraperDownloadUrl;
|
|
52
|
+
private videoBuilderUrl;
|
|
53
|
+
private usageStatsUrl;
|
|
54
|
+
private proxyUsersUrl;
|
|
55
|
+
private whitelistUrl;
|
|
56
|
+
private proxyListUrl;
|
|
57
|
+
private proxyExpirationUrl;
|
|
58
|
+
private taskListUrl;
|
|
27
59
|
constructor(config: ThordataClientConfig);
|
|
28
60
|
/**
|
|
29
|
-
*
|
|
61
|
+
* Execute request with retry logic.
|
|
30
62
|
*/
|
|
31
63
|
private execute;
|
|
32
|
-
|
|
33
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Perform a search using the SERP API.
|
|
66
|
+
*
|
|
67
|
+
* Supported engines: google, bing, yandex, duckduckgo
|
|
68
|
+
* Plus Google specialized engines: google_news, google_shopping, etc.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* // Basic Google search
|
|
73
|
+
* const results = await client.serpSearch({
|
|
74
|
+
* query: "pizza",
|
|
75
|
+
* engine: Engine.GOOGLE,
|
|
76
|
+
* country: "us",
|
|
77
|
+
* });
|
|
78
|
+
*
|
|
79
|
+
* // Google News (recommended: use dedicated engine)
|
|
80
|
+
* const news = await client.serpSearch({
|
|
81
|
+
* query: "AI regulation",
|
|
82
|
+
* engine: Engine.GOOGLE_NEWS,
|
|
83
|
+
* });
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
serpSearch(options: SerpOptions): Promise<Record<string, unknown>>;
|
|
87
|
+
/**
|
|
88
|
+
* Scrape a URL using the Universal/Web Unlocker API.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* // Basic HTML scraping
|
|
93
|
+
* const html = await client.universalScrape({
|
|
94
|
+
* url: "https://example.com",
|
|
95
|
+
* jsRender: false,
|
|
96
|
+
* });
|
|
97
|
+
*
|
|
98
|
+
* // With JS rendering and wait for element
|
|
99
|
+
* const html = await client.universalScrape({
|
|
100
|
+
* url: "https://example.com/spa",
|
|
101
|
+
* jsRender: true,
|
|
102
|
+
* waitFor: ".main-content",
|
|
103
|
+
* });
|
|
104
|
+
*
|
|
105
|
+
* // Screenshot
|
|
106
|
+
* const png = await client.universalScrape({
|
|
107
|
+
* url: "https://example.com",
|
|
108
|
+
* jsRender: true,
|
|
109
|
+
* outputFormat: "png",
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
universalScrape(options: UniversalOptions): Promise<string | Buffer | Record<string, unknown>>;
|
|
114
|
+
/**
|
|
115
|
+
* Create a new Web Scraper task.
|
|
116
|
+
*/
|
|
34
117
|
createScraperTask(options: ScraperTaskOptions): Promise<string>;
|
|
118
|
+
/**
|
|
119
|
+
* Verify that public credentials are available.
|
|
120
|
+
*/
|
|
35
121
|
private requirePublicCreds;
|
|
122
|
+
/**
|
|
123
|
+
* Get the status of a Web Scraper task.
|
|
124
|
+
*/
|
|
36
125
|
getTaskStatus(taskId: string): Promise<string>;
|
|
126
|
+
/**
|
|
127
|
+
* Get the download URL for a completed task's results.
|
|
128
|
+
*/
|
|
37
129
|
getTaskResult(taskId: string, fileType?: "json" | "csv" | "xlsx"): Promise<string>;
|
|
130
|
+
/**
|
|
131
|
+
* Create a YouTube video/audio download task.
|
|
132
|
+
*/
|
|
133
|
+
createVideoTask(options: VideoTaskOptions): Promise<string>;
|
|
134
|
+
/**
|
|
135
|
+
* Wait for a task to complete.
|
|
136
|
+
*/
|
|
38
137
|
waitForTask(taskId: string, options?: WaitForTaskOptions): Promise<string>;
|
|
138
|
+
/**
|
|
139
|
+
* Make an HTTP request through a proxy.
|
|
140
|
+
*/
|
|
39
141
|
request(url: string, config?: {
|
|
40
142
|
proxy?: Proxy;
|
|
41
143
|
timeout?: number;
|
|
42
|
-
[key: string]:
|
|
43
|
-
}): Promise<
|
|
144
|
+
[key: string]: unknown;
|
|
145
|
+
}): Promise<unknown>;
|
|
146
|
+
listTasks(page?: number, size?: number): Promise<{
|
|
147
|
+
count: number;
|
|
148
|
+
list: any[];
|
|
149
|
+
}>;
|
|
150
|
+
getUsageStatistics(fromDate: string, toDate: string): Promise<UsageStatistics>;
|
|
151
|
+
listProxyUsers(proxyType?: ProxyTypeParam): Promise<ProxyUserList>;
|
|
152
|
+
createProxyUser(username: string, pass: string, trafficLimit?: number, status?: boolean, proxyType?: ProxyTypeParam): Promise<any>;
|
|
153
|
+
addWhitelistIp(ip: string, status?: boolean, proxyType?: ProxyTypeParam): Promise<any>;
|
|
154
|
+
listProxyServers(proxyType: 1 | 2): Promise<ProxyServer[]>;
|
|
155
|
+
private buildSignHeaders;
|
|
156
|
+
getResidentialBalance(): Promise<{
|
|
157
|
+
balance: number;
|
|
158
|
+
expire_time: number;
|
|
159
|
+
}>;
|
|
160
|
+
getIspRegions(): Promise<any[]>;
|
|
161
|
+
listIspProxies(): Promise<any[]>;
|
|
162
|
+
/**
|
|
163
|
+
* Internal method to call locations API.
|
|
164
|
+
*/
|
|
165
|
+
private getLocations;
|
|
166
|
+
/**
|
|
167
|
+
* List all supported countries for a proxy type.
|
|
168
|
+
*/
|
|
169
|
+
listCountries(proxyType?: ProxyTypeParam): Promise<CountryInfo[]>;
|
|
170
|
+
/**
|
|
171
|
+
* List states/regions for a country.
|
|
172
|
+
*/
|
|
173
|
+
listStates(countryCode: string, proxyType?: ProxyTypeParam): Promise<StateInfo[]>;
|
|
174
|
+
/**
|
|
175
|
+
* List cities for a country (and optionally state).
|
|
176
|
+
*/
|
|
177
|
+
listCities(countryCode: string, stateCode?: string, proxyType?: ProxyTypeParam): Promise<CityInfo[]>;
|
|
178
|
+
/**
|
|
179
|
+
* List ASNs for a country.
|
|
180
|
+
*/
|
|
181
|
+
listAsns(countryCode: string, proxyType?: ProxyTypeParam): Promise<AsnInfo[]>;
|
|
44
182
|
}
|