ワンクリックで動画・画像を保存する。
< Twitter Media Downloaderについてのフィードバック
graphql后面的id会定期变更
应该是所有人都一样的,跟访问限制好像没多大关系
频繁下载会被限制访问,不清楚什么条件下会触发
免费用户比较严格,使用vpn的也比较严格(多人共用1个ip)
我的两个推特账号的queryID是不同的,全局搜索的结果显示
这个queryID来自请求https://abs.twimg.com/responsive-web/client-web/main.{hash}.js
这个js文件是通过网页head中的link标签引入的
那就说明至少不是所有人的queryID都是相同的
但是不清楚具体的机制了
(我还是觉得这个queryID每账号不同的可能性大一些)
这两天有时间又试了试,如果需要动态获取可以参考这个方法
const mainJSURLRegex = /^https:\/\/abs\.twimg\.com\/responsive-web\/client-web\/main\.[a-f0-9]+\.js$/;
let mainJSURL;
document.querySelectorAll('link').forEach(link => {
if (mainJSURLRegex.test(link.href)) {
mainJSURL = link.href;
}
});
const mainJSString = await fetch(mainJSURL)
.then(response => response.text())
.then(data => data.replaceAll(' ', ''));
const getAPID = (opName) => {
const regex = new RegExp(`{\\s*queryId:"[^"]*",\\s*operationName:"${opName}",\\s*operationType:"query",\\s*metadata:{\\s*featureSwitches:[^}]*,\\s*fieldToggles:[^}]*}\\s*}`, 'g');
const match = regex.exec(mainString);
if (match) {
const result = match[0].replace(/(['"])?([a-zA-Z0-9_]+)(['"])?:/g, '"$2":');
return JSON.parse(result)['queryId'];
} else {
return null;
}
}
console.log(getAPID('TweetDetail'));
看到之前的反馈有人提到有时无法下载
关于不能下载可能是请求API中ID限额的问题,不知道有没有解决,但是我看最新的代码还是固定的ID
我也找到了这个请求https://twitter.com/i/api/graphql/${apidTwetDetail}/TweetDetail
大概研究了下,这个应该是每个人都不一样,控制台的话可以使用下面这段代码获取
下载不了的小伙伴可以尝试自己更改一下代码中的ID
脚本因为js上下文隔离的问题,情况不太一样
油猴比较麻烦,只能通过修改原型链方式截获请求(也可能有我没想到的办法)
插件的脚本方便一些,可以向页面插入script标签方式间接获取
因为之前一直在用的脚本前段时间突然不能用了,最开始自己尝试在网页端模拟请求无果,本以为推特的请求只能通过官方100刀的api获取,后来看到作者脚本代码才成功请求到数据,在此表示感谢。
在这里也提供一些我封装的API请求方法,希望在后续更新中有所帮助。