rac*_*ker 0 google-sheets http-headers google-apps-script custom-function tiktok
我使用 URLFetchApp 在 Apps 脚本中构建了一个简单的自定义函数来获取 TikTok 帐户的关注者计数。
function tiktok_fans() {
var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
var handle = '@charlidamelio';
var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
var match_text = raw_data.exec(web_content);
var result = (match_text[2]);
Logger.log(result)
return result
}
Run Code Online (Sandbox Code Playgroud)
日志会返回正确的关注者数量。
但是,当我将代码更改为;
function tiktok_fans(handle) {
var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
//var handle = '@charlidamelio';
var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
var match_text = raw_data.exec(web_content);
var result = (match_text[2]);
Logger.log(result)
return result
}
Run Code Online (Sandbox Code Playgroud)
并在电子表格中使用它,例如=tiktok_fans(A1),其中 A1@charlidamelio我#ERROR在单元格中得到响应
类型错误:无法读取 null 的属性“2”(第 6 行)。
为什么它在日志中有效,但在电子表格中无效?
- 附加信息 -
在测试下面的 @Tanaike 答案后仍然遇到相同的错误,“TypeError:无法读取 null 的属性‘2’(第 6 行)。”
已手动映射以查看错误,每次运行以下命令时,不同的日志都会返回“null”。我相信这与缓存中的 ContentText 大小有关。我尝试过Utilities.sleep()在函数之间使用,但没有成功,我仍然得到空值。
代码
var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
//tiktok urls
var qld = UrlFetchApp.fetch('https://www.tiktok.com/@thisisqueensland?lang=en').getContentText();
var nsw = UrlFetchApp.fetch('https://www.tiktok.com/@visitnsw?lang=en').getContentText();
var syd = UrlFetchApp.fetch('https://www.tiktok.com/@sydney?lang=en').getContentText();
var tas = UrlFetchApp.fetch('https://www.tiktok.com/@tasmania?lang=en').getContentText();
var nt = UrlFetchApp.fetch('https://www.tiktok.com/@ntaustralia?lang=en').getContentText();
var nz = UrlFetchApp.fetch('https://www.tiktok.com/@purenz?lang=en').getContentText();
var aus = UrlFetchApp.fetch('https://www.tiktok.com/@australia?lang=en').getContentText();
var vic = UrlFetchApp.fetch('https://www.tiktok.com/@visitmelbourne?lang=en').getContentText();
//find folowers with regex
var match_qld = raw_data.exec(qld);
var match_nsw = raw_data.exec(nsw);
var match_syd = raw_data.exec(syd);
var match_tas = raw_data.exec(tas);
var match_nt = raw_data.exec(nt);
var match_nz = raw_data.exec(nz);
var match_aus = raw_data.exec(aus);
var match_vic = raw_data.exec(vic);
Logger.log(match_qld);
Logger.log(match_nsw);
Logger.log(match_syd);
Logger.log(match_tas);
Logger.log(match_nt);
Logger.log(match_nz);
Logger.log(match_aus);
Logger.log(match_vic);
Run Code Online (Sandbox Code Playgroud)
根据您的情况,我记得使用自定义函数的 UrlFetchApp 的请求与使用脚本编辑器的 UrlFetchApp 的请求不同。所以我认为你的问题的原因可能与这个线程有关。/sf/answers/4411737151/在您的情况下,您的情况似乎与该线程相反。但是,我们认为这个问题是由于站点的规范造成的。
为了检查这种差异,我检查了检索到的 HTML 数据的文件大小。
从上面的结果可以发现,脚本编辑器和自定义函数检索到的HTML是不同的。即,自定义函数检索的 HTML 数据不包含("followerCount":)([0-9]+). 由此,会发生这样的错误。我认为这可能是您问题的原因。
当我使用 Web 应用程序和触发器测试您的情况时,出现了同样的问题。由此看来,现阶段我认为自动执行脚本的方法可能无法使用。那么,作为一种解决方法,使用按钮和自定义菜单怎么样?当按钮和自定义菜单运行脚本时,脚本将起作用。看来这个方法和脚本编辑器的方法是一样的。
示例脚本如下。
在运行脚本之前,请先设置range. 例如,请将此功能分配给电子表格上的按钮。当您单击该按钮时,脚本就会运行。在此示例中,假设将类似值@charlidamelio放入“A”列中。
function sample() {
var range = "A2:A10"; // Please set the range of "handle".
var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
var sheet = SpreadsheetApp.getActiveSheet();
var r = sheet.getRange(range);
var values = r.getValues();
var res = values.map(([handle]) => {
if (handle != "") {
var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
var match_text = raw_data.exec(web_content);
return [match_text[2]];
}
return [""];
});
r.offset(0, 1).setValues(res);
}
Run Code Online (Sandbox Code Playgroud)
关于以下附加问题,
虽然这适用于 1 个 TikTok 句柄,但当尝试运行多个 TikTok 句柄时,每次都会失败,并出现错误 TypeError: Cannot read property '2' of null。经过一些调查并手动映射 8 个句柄后,我可以看到每次运行时,它都会为一个或多个 web_content 变量返回“null”。有没有一种方法可以减慢脚本速度/一次运行每个 UrlFetchApp 以确保每个 UrlFetchApp 返回内容?
我已经尝试过这个,但仍然收到错误。已经尝试到10000ms。我在原来的问题中添加了更多细节,希望这对错误有意义。我总是在不同的日志中得到空值,因此我认为这是一个计时或缓存问题。
在这种情况下,下面的示例脚本怎么样?
在此示例脚本中,当无法从 URL 检索值时,将尝试再次检索该值作为重试。此示例脚本使用 2 次作为重试次数。因此当重试2次仍无法检索到该值时,则返回空值。
function sample() {
var range = "A2:A10"; // Please set the range of "handle".
var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
var sheet = SpreadsheetApp.getActiveSheet();
var r = sheet.getRange(range);
var values = r.getValues();
var res = values.map(([handle]) => {
if (handle != "") {
var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
var match_text = raw_data.exec(web_content);
if (!match_text || match_text.length != 3) {
var retry = 2; // Number of retry.
for (var i = 0; i < retry; i++) {
Utilities.sleep(3000);
web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
match_text = raw_data.exec(web_content);
if (match_text || match_text.length == 3) break;
}
}
return [match_text && match_text.length == 3 ? match_text[2] : ""];
}
return [""];
});
r.offset(0, 1).setValues(res);
}
Run Code Online (Sandbox Code Playgroud)
retry请调整和的值Utilities.sleep(3000)。| 归档时间: |
|
| 查看次数: |
409 次 |
| 最近记录: |