rettiwt-api 6.0.7 → 6.0.8
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.
|
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.FetcherService = void 0;
|
|
37
37
|
const axios_1 = __importStar(require("axios"));
|
|
38
38
|
const cookiejar_1 = require("cookiejar");
|
|
39
|
+
const jsdom_1 = require("jsdom");
|
|
39
40
|
const x_client_transaction_id_glacier_1 = require("x-client-transaction-id-glacier");
|
|
40
41
|
const Groups_1 = require("../../collections/Groups");
|
|
41
42
|
const Requests_1 = require("../../collections/Requests");
|
|
@@ -118,7 +119,7 @@ class FetcherService {
|
|
|
118
119
|
*/
|
|
119
120
|
async _getTransactionHeader(method, url) {
|
|
120
121
|
// Get the X homepage HTML document (using utility function)
|
|
121
|
-
const document = await
|
|
122
|
+
const document = await this._handleXMigration();
|
|
122
123
|
// Create and initialize ClientTransaction instance
|
|
123
124
|
const transaction = await x_client_transaction_id_glacier_1.ClientTransaction.create(document);
|
|
124
125
|
// Getting the URL path excluding all params
|
|
@@ -131,6 +132,66 @@ class FetcherService {
|
|
|
131
132
|
/* eslint-enable @typescript-eslint/naming-convention */
|
|
132
133
|
};
|
|
133
134
|
}
|
|
135
|
+
async _handleXMigration() {
|
|
136
|
+
// Fetch X.com homepage
|
|
137
|
+
const homePageResponse = await axios_1.default.get('https://x.com', {
|
|
138
|
+
headers: this.config.headers,
|
|
139
|
+
httpAgent: this.config.httpsAgent,
|
|
140
|
+
httpsAgent: this.config.httpsAgent,
|
|
141
|
+
});
|
|
142
|
+
// Parse HTML using linkedom
|
|
143
|
+
let dom = new jsdom_1.JSDOM(homePageResponse.data);
|
|
144
|
+
let document = dom.window.document;
|
|
145
|
+
// Check for migration redirection links
|
|
146
|
+
const migrationRedirectionRegex = new RegExp('(http(?:s)?://(?:www\\.)?(twitter|x){1}\\.com(/x)?/migrate([/?])?tok=[a-zA-Z0-9%\\-_]+)+', 'i');
|
|
147
|
+
const metaRefresh = document.querySelector("meta[http-equiv='refresh']");
|
|
148
|
+
const metaContent = metaRefresh ? metaRefresh.getAttribute('content') || '' : '';
|
|
149
|
+
const migrationRedirectionUrl = migrationRedirectionRegex.exec(metaContent) || migrationRedirectionRegex.exec(homePageResponse.data);
|
|
150
|
+
if (migrationRedirectionUrl) {
|
|
151
|
+
// Follow redirection URL
|
|
152
|
+
const redirectResponse = await axios_1.default.get(migrationRedirectionUrl[0], {
|
|
153
|
+
httpAgent: this.config.httpsAgent,
|
|
154
|
+
httpsAgent: this.config.httpsAgent,
|
|
155
|
+
});
|
|
156
|
+
dom = new jsdom_1.JSDOM(redirectResponse.data);
|
|
157
|
+
document = dom.window.document;
|
|
158
|
+
}
|
|
159
|
+
// Handle migration form if present
|
|
160
|
+
const migrationForm = document.querySelector("form[name='f']") ||
|
|
161
|
+
document.querySelector("form[action='https://x.com/x/migrate']");
|
|
162
|
+
if (migrationForm) {
|
|
163
|
+
const url = migrationForm.getAttribute('action') || 'https://x.com/x/migrate';
|
|
164
|
+
const method = migrationForm.getAttribute('method') || 'POST';
|
|
165
|
+
// Collect form input fields
|
|
166
|
+
const requestPayload = new FormData();
|
|
167
|
+
const inputFields = migrationForm.querySelectorAll('input');
|
|
168
|
+
for (const element of Array.from(inputFields)) {
|
|
169
|
+
const name = element.getAttribute('name');
|
|
170
|
+
const value = element.getAttribute('value');
|
|
171
|
+
if (name && value) {
|
|
172
|
+
requestPayload.append(name, value);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Submit form using POST request
|
|
176
|
+
const formResponse = await axios_1.default.request({
|
|
177
|
+
method: method,
|
|
178
|
+
url: url,
|
|
179
|
+
data: requestPayload,
|
|
180
|
+
headers: {
|
|
181
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
182
|
+
'Content-Type': 'multipart/form-data',
|
|
183
|
+
...this.config.headers,
|
|
184
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
185
|
+
},
|
|
186
|
+
httpAgent: this.config.httpsAgent,
|
|
187
|
+
httpsAgent: this.config.httpsAgent,
|
|
188
|
+
});
|
|
189
|
+
dom = new jsdom_1.JSDOM(formResponse.data);
|
|
190
|
+
document = dom.window.document;
|
|
191
|
+
}
|
|
192
|
+
// Return final DOM document
|
|
193
|
+
return document;
|
|
194
|
+
}
|
|
134
195
|
/**
|
|
135
196
|
* Validates the given args against the given resource.
|
|
136
197
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetcherService.js","sourceRoot":"","sources":["../../../src/services/public/FetcherService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA4C;AAC5C,yCAAmC;AACnC,
|
|
1
|
+
{"version":3,"file":"FetcherService.js","sourceRoot":"","sources":["../../../src/services/public/FetcherService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA4C;AAC5C,yCAAmC;AACnC,iCAA8B;AAC9B,qFAAoE;AAEpE,qDAAkH;AAClH,yDAAsD;AACtD,yCAA4C;AAC5C,iDAAiD;AAEjD,2DAAwD;AACxD,yDAAsD;AACtD,qEAAkE;AAOlE,yDAAsD;AACtD,2DAAwD;AACxD,uDAAoD;AAEpD;;;;GAIG;AACH,MAAa,cAAc;IAC1B,uCAAuC;IACtB,KAAK,CAAc;IAEpC,4CAA4C;IAC3B,MAAM,CAA6C;IAEpE,qDAAqD;IACpC,aAAa,CAAgB;IAE9C,wCAAwC;IACvB,QAAQ,CAAS;IAElC,yBAAyB;IACN,MAAM,CAAgB;IAEzC;;OAEG;IACH,YAAmB,MAAqB;QACvC,uBAAU,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,2BAAY,EAAE,CAAC;QAC/D,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACK,mBAAmB,CAAC,QAAsB;QACjD,UAAU;QACV,uBAAU,CAAC,GAAG,CAAC,oBAAU,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;QAE7F,gCAAgC;QAChC,IAAI,CAAC,sCAA6B,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC1F,MAAM,IAAI,KAAK,CAAC,eAAS,CAAC,oBAAoB,CAAC,CAAC;QACjD,CAAC;IACF,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc;QAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxB,UAAU;YACV,uBAAU,CAAC,GAAG,CAAC,oBAAU,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAE9D,OAAO,IAAI,+BAAc,CACxB,yBAAW,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;iBAC1C,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,kBAAM,CAAC,IAAI,CAAC,CAAC,CACjC,CAAC;QACH,CAAC;aAAM,CAAC;YACP,UAAU;YACV,uBAAU,CAAC,GAAG,CAAC,oBAAU,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;YAEnE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;IACF,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,qBAAqB,CAAC,MAAc,EAAE,GAAW;QAC9D,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEhD,mDAAmD;QACnD,MAAM,WAAW,GAAG,MAAM,mDAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE7D,4CAA4C;QAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAExD,gCAAgC;QAChC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,qBAAqB,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;QAEhF,OAAO;YACN,yDAAyD;YACzD,yBAAyB,EAAE,GAAG;YAC9B,wDAAwD;SACxD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC9B,uBAAuB;QACvB,MAAM,gBAAgB,GAAG,MAAM,eAAK,CAAC,GAAG,CAAS,eAAe,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YACjC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;SAClC,CAAC,CAAC;QAEH,4BAA4B;QAC5B,IAAI,GAAG,GAAG,IAAI,aAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAEnC,wCAAwC;QACxC,MAAM,yBAAyB,GAAG,IAAI,MAAM,CAC3C,0FAA0F,EAC1F,GAAG,CACH,CAAC;QAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjF,MAAM,uBAAuB,GAC5B,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEtG,IAAI,uBAAuB,EAAE,CAAC;YAC7B,yBAAyB;YACzB,MAAM,gBAAgB,GAAG,MAAM,eAAK,CAAC,GAAG,CAAS,uBAAuB,CAAC,CAAC,CAAC,EAAE;gBAC5E,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;gBACjC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;aAClC,CAAC,CAAC;YAEH,GAAG,GAAG,IAAI,aAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChC,CAAC;QAED,mCAAmC;QACnC,MAAM,aAAa,GAClB,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC;YACxC,QAAQ,CAAC,aAAa,CAAC,wCAAwC,CAAC,CAAC;QAElE,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,yBAAyB,CAAC;YAC9E,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;YAE9D,4BAA4B;YAC5B,MAAM,cAAc,GAAG,IAAI,QAAQ,EAAE,CAAC;YAEtC,MAAM,WAAW,GAAG,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC5D,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;oBACnB,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACpC,CAAC;YACF,CAAC;YAED,iCAAiC;YACjC,MAAM,YAAY,GAAG,MAAM,eAAK,CAAC,OAAO,CAAS;gBAChD,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG;gBACR,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE;oBACR,yDAAyD;oBAEzD,cAAc,EAAE,qBAAqB;oBACrC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;oBAEtB,wDAAwD;iBACxD;gBACD,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;gBACjC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;aAClC,CAAC,CAAC;YAEH,GAAG,GAAG,IAAI,aAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACnC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChC,CAAC;QAED,4BAA4B;QAC5B,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;;;;;OAOG;IACK,aAAa,CAAC,QAAsB,EAAE,IAA4B;QACzE,IAAI,4BAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,UAAU;YACV,uBAAU,CAAC,GAAG,CAAC,oBAAU,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YAE9D,OAAO,IAAI,qBAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,2BAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClD,UAAU;YACV,uBAAU,CAAC,GAAG,CAAC,oBAAU,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAE7D,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,KAAK;QAClB,2BAA2B;QAC3B,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC9B,OAAO;QACR,CAAC;QAED,gCAAgC;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YACnD,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;YAC5D,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,CAAC;QAED,8BAA8B;QAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACI,KAAK,CAAC,OAAO,CAAc,QAAsB,EAAE,IAA4B;QACrF,gCAAgC;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,yBAAyB;QACzB,IAAI,KAAK,GAAY,SAAS,CAAC;QAE/B,UAAU;QACV,uBAAU,CAAC,GAAG,CAAC,oBAAU,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvE,oDAAoD;QACpD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAEnC,kBAAkB;QAClB,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAE,CAAC;QAE3C,+BAA+B;QAC/B,MAAM,IAAI,GAAmB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAEzD,gCAAgC;QAChC,MAAM,MAAM,GAAG,mBAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;QAExC,wCAAwC;QACxC,MAAM,CAAC,OAAO,GAAG;YAChB,GAAG,MAAM,CAAC,OAAO;YACjB,GAAG,IAAI,CAAC,QAAQ,EAAE;YAClB,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;SACtB,CAAC;QACF,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC1C,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC3C,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,8BAA8B;QAC9B,GAAG,CAAC;YACH,sBAAsB;YACtB,IAAI,CAAC;gBACJ,gDAAgD;gBAChD,MAAM,CAAC,OAAO,GAAG;oBAChB,GAAG,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;oBAC5E,GAAG,MAAM,CAAC,OAAO;iBACjB,CAAC;gBAEF,sBAAsB;gBACtB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBAEnB,6BAA6B;gBAC7B,OAAO,CAAC,MAAM,IAAA,eAAK,EAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,8BAA8B;gBAC9B,IAAI,IAAA,oBAAY,EAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC7C,KAAK,GAAG,GAAG,CAAC;oBACZ,SAAS;gBACV,CAAC;gBACD,gCAAgC;qBAC3B,CAAC;oBACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC/B,MAAM,GAAG,CAAC;gBACX,CAAC;YACF,CAAC;oBAAS,CAAC;gBACV,0CAA0C;gBAC1C,KAAK,EAAE,CAAC;YACT,CAAC;QACF,CAAC,QAAQ,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;QAEzC,oEAAoE;QACpE,MAAM,KAAK,CAAC;IACb,CAAC;CACD;AA9TD,wCA8TC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rettiwt-api",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.8",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"description": "An API for fetching data from TwitterAPI, without any rate limits!",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/cookiejar": "^2.1.5",
|
|
36
|
+
"@types/jsdom": "^27.0.0",
|
|
36
37
|
"@types/node": "^22.13.1",
|
|
37
38
|
"@typescript-eslint/eslint-plugin": "^8.24.0",
|
|
38
39
|
"@typescript-eslint/parser": "^8.24.0",
|
|
@@ -50,6 +51,7 @@
|
|
|
50
51
|
"commander": "^11.1.0",
|
|
51
52
|
"cookiejar": "^2.1.4",
|
|
52
53
|
"https-proxy-agent": "^7.0.6",
|
|
54
|
+
"jsdom": "^27.2.0",
|
|
53
55
|
"node-html-parser": "^7.0.1",
|
|
54
56
|
"x-client-transaction-id-glacier": "^1.0.0"
|
|
55
57
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import axios, { isAxiosError } from 'axios';
|
|
2
2
|
import { Cookie } from 'cookiejar';
|
|
3
|
-
import {
|
|
3
|
+
import { JSDOM } from 'jsdom';
|
|
4
|
+
import { ClientTransaction } from 'x-client-transaction-id-glacier';
|
|
4
5
|
|
|
5
6
|
import { AllowGuestAuthenticationGroup, FetchResourcesGroup, PostResourcesGroup } from '../../collections/Groups';
|
|
6
7
|
import { Requests } from '../../collections/Requests';
|
|
@@ -103,7 +104,7 @@ export class FetcherService {
|
|
|
103
104
|
*/
|
|
104
105
|
private async _getTransactionHeader(method: string, url: string): Promise<ITransactionHeader> {
|
|
105
106
|
// Get the X homepage HTML document (using utility function)
|
|
106
|
-
const document = await
|
|
107
|
+
const document = await this._handleXMigration();
|
|
107
108
|
|
|
108
109
|
// Create and initialize ClientTransaction instance
|
|
109
110
|
const transaction = await ClientTransaction.create(document);
|
|
@@ -121,6 +122,87 @@ export class FetcherService {
|
|
|
121
122
|
};
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
private async _handleXMigration(): Promise<Document> {
|
|
126
|
+
// Fetch X.com homepage
|
|
127
|
+
const homePageResponse = await axios.get<string>('https://x.com', {
|
|
128
|
+
headers: this.config.headers,
|
|
129
|
+
httpAgent: this.config.httpsAgent,
|
|
130
|
+
httpsAgent: this.config.httpsAgent,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Parse HTML using linkedom
|
|
134
|
+
let dom = new JSDOM(homePageResponse.data);
|
|
135
|
+
let document = dom.window.document;
|
|
136
|
+
|
|
137
|
+
// Check for migration redirection links
|
|
138
|
+
const migrationRedirectionRegex = new RegExp(
|
|
139
|
+
'(http(?:s)?://(?:www\\.)?(twitter|x){1}\\.com(/x)?/migrate([/?])?tok=[a-zA-Z0-9%\\-_]+)+',
|
|
140
|
+
'i',
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
const metaRefresh = document.querySelector("meta[http-equiv='refresh']");
|
|
144
|
+
const metaContent = metaRefresh ? metaRefresh.getAttribute('content') || '' : '';
|
|
145
|
+
|
|
146
|
+
const migrationRedirectionUrl =
|
|
147
|
+
migrationRedirectionRegex.exec(metaContent) || migrationRedirectionRegex.exec(homePageResponse.data);
|
|
148
|
+
|
|
149
|
+
if (migrationRedirectionUrl) {
|
|
150
|
+
// Follow redirection URL
|
|
151
|
+
const redirectResponse = await axios.get<string>(migrationRedirectionUrl[0], {
|
|
152
|
+
httpAgent: this.config.httpsAgent,
|
|
153
|
+
httpsAgent: this.config.httpsAgent,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
dom = new JSDOM(redirectResponse.data);
|
|
157
|
+
document = dom.window.document;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Handle migration form if present
|
|
161
|
+
const migrationForm =
|
|
162
|
+
document.querySelector("form[name='f']") ||
|
|
163
|
+
document.querySelector("form[action='https://x.com/x/migrate']");
|
|
164
|
+
|
|
165
|
+
if (migrationForm) {
|
|
166
|
+
const url = migrationForm.getAttribute('action') || 'https://x.com/x/migrate';
|
|
167
|
+
const method = migrationForm.getAttribute('method') || 'POST';
|
|
168
|
+
|
|
169
|
+
// Collect form input fields
|
|
170
|
+
const requestPayload = new FormData();
|
|
171
|
+
|
|
172
|
+
const inputFields = migrationForm.querySelectorAll('input');
|
|
173
|
+
for (const element of Array.from(inputFields)) {
|
|
174
|
+
const name = element.getAttribute('name');
|
|
175
|
+
const value = element.getAttribute('value');
|
|
176
|
+
if (name && value) {
|
|
177
|
+
requestPayload.append(name, value);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Submit form using POST request
|
|
182
|
+
const formResponse = await axios.request<string>({
|
|
183
|
+
method: method,
|
|
184
|
+
url: url,
|
|
185
|
+
data: requestPayload,
|
|
186
|
+
headers: {
|
|
187
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
188
|
+
|
|
189
|
+
'Content-Type': 'multipart/form-data',
|
|
190
|
+
...this.config.headers,
|
|
191
|
+
|
|
192
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
193
|
+
},
|
|
194
|
+
httpAgent: this.config.httpsAgent,
|
|
195
|
+
httpsAgent: this.config.httpsAgent,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
dom = new JSDOM(formResponse.data);
|
|
199
|
+
document = dom.window.document;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Return final DOM document
|
|
203
|
+
return document;
|
|
204
|
+
}
|
|
205
|
+
|
|
124
206
|
/**
|
|
125
207
|
* Validates the given args against the given resource.
|
|
126
208
|
*
|