Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

编译成百度小程序被百度蜘蛛抓取,url后被加上大量taroTimeStamp参数导致收录异常 #11713

Closed
willxucn opened this issue Apr 24, 2022 · 17 comments · Fixed by #11827
Assignees
Labels
F-react Framework - React good first issue Good for newcomers P-1 High, patch T-swan Target - 编译到百度小程序 V-3 Version - 3.x
Milestone

Comments

@willxucn
Copy link

相关平台

百度小程序

小程序基础库: 3.320.32
使用框架: React

复现步骤

测试的taro版本是 3.4.6

直接编译成小程序提交给百度平台,审核过了以后,查看索引收录,会发现一大堆的相同页面,我这里出现了1600多条低质量页面,url前面路径完全一样,只不过url后面TaroTimeStamp挂了不同的值

这个地址是baiduapp的蜘蛛爬取的

对于这些链接,百度提示:资源内容低质则无法被搜索索引,请尽快修复或 删除死链

错误原因:该页面内容空短,不符合索引要求,请修改后重新提交

有问题的链接(从1600多条里面任选3条共参考):

/pages/index/index?%24taroTimestamp=1650014884199&%2524taroTimestamp=1649991556745&%252524taroTimestamp=1649968514119&%25252524taroTimestamp=1649892730538&%2525252524taroTimestamp=1649816854870

/pages/index/index?%24taroTimestamp=1650133248471&%2524taroTimestamp=1650079123259&%252524taroTimestamp=1650024688141&%25252524taroTimestamp=1649968624472&%2525252524taroTimestamp=1649968597357

/pages/index/index?%24taroTimestamp=1650112016426&%2524taroTimestamp=1650111757652&%252524taroTimestamp=1650100893370&%25252524taroTimestamp=1650090070493&%2525252524taroTimestamp=1650068412300

期望结果

在baiduapp蜘蛛抓取小程序内容时,不应该出现 TaroTimeStamp的参数
链接仅仅应该是:

/pages/index/index

实际结果

同一个url,后面出现大量不同的TaroTimeStamp的值

有问题的链接(从1600多条里面任选3条共参考):

/pages/index/index?%24taroTimestamp=1650014884199&%2524taroTimestamp=1649991556745&%252524taroTimestamp=1649968514119&%25252524taroTimestamp=1649892730538&%2525252524taroTimestamp=1649816854870

/pages/index/index?%24taroTimestamp=1650133248471&%2524taroTimestamp=1650079123259&%252524taroTimestamp=1650024688141&%25252524taroTimestamp=1649968624472&%2525252524taroTimestamp=1649968597357

/pages/index/index?%24taroTimestamp=1650112016426&%2524taroTimestamp=1650111757652&%252524taroTimestamp=1650100893370&%25252524taroTimestamp=1650090070493&%2525252524taroTimestamp=1650068412300

环境信息

👽 Taro v3.4.6


  Taro CLI 3.4.6 environment info:
    System:
      OS: Windows 10
    Binaries:
      Node: 16.13.2 - D:\ProgramData\Miniconda3\envs\tarojs3\node.EXE
      npm: 8.1.2 - D:\ProgramData\Miniconda3\envs\tarojs3\npm.CMD
@taro-bot2 taro-bot2 bot added F-react Framework - React T-swan Target - 编译到百度小程序 V-3 Version - 3.x labels Apr 24, 2022
@oyvfhp
Copy link

oyvfhp commented Apr 27, 2022

求解,我这边也有这样的情况。

@oyvfhp
Copy link

oyvfhp commented Apr 27, 2022

@Chen-jj @luckyadam 两位大佬帮看下。
百度小程序的抓取是根据用户访问的路径抓取的,taroTimestamp参数一直变,导致百度小程序抓取时将一个地址当作N个页面来抓取了。

@Chen-jj
Copy link
Contributor

Chen-jj commented Apr 27, 2022

Taro 只会在页面 onLoad 的时候修改一下路由参数加个时间戳:

options.$taroTimestamp = Date.now()

不懂为什么百度抓了一堆 timeStamp 后缀

@oyvfhp
Copy link

oyvfhp commented Apr 27, 2022

看地址,不一次执行了onLoad,而是很多次
/pages/wenda/major/major?%24taroTimestamp=1646197398086&%2524taroTimestamp=1646164884874&%252524taroTimestamp=1646121526181&%25252524taroTimestamp=1646099787995
同时还进行了多次urlencode,导致出现 %2524 符号,要进行两次urldecode
@Chen-jj ,我先和百度小程序沟通一下,他们的抓取原理,再来找您沟通。

@oyvfhp
Copy link

oyvfhp commented Apr 27, 2022

这里是不是也讨论一下,如果有$taroTimestamp的情况下,进行一下覆盖?而不是新加。

@Chen-jj
Copy link
Contributor

Chen-jj commented Apr 27, 2022

也不是新加吧,你看上面的代码,只是改了 options 一次。新页面 onLoad,又是新的 options 对象了。就算百度扔相同的 options 对象进来,设置相同 keyname 的属性也不会出现多条数据。。

@oyvfhp
Copy link

oyvfhp commented Apr 27, 2022

恩,具体看了一下代码,确实是。
/pages/wenda/major/major?%24taroTimestamp=1646197398086&%2524taroTimestamp=1646164884874&%252524taroTimestamp=1646121526181&%25252524taroTimestamp=1646099787995
他们进行了几次urlencode赞成的。
?%24taroTimestamp=1646197398086&%2524taroTimestamp=1646164884874&%252524taroTimestamp=1646121526181&%25252524taroTimestamp=1646099787995
%24
%2524
%252524
%25252524
😂😂😂,导致每次都进添加一次新的$taroTimestamp

@willxucn
Copy link
Author

willxucn commented Apr 27, 2022

如果spider来抓,其实不能加timestamp,否则会被认为是不同资源,或者根据来抓的蜘蛛UA,碰到蜘蛛就不要加timestamp

@willxucn
Copy link
Author

@Chen-jj @luckyadam 两位大佬帮看下。 百度小程序的抓取是根据用户访问的路径抓取的,taroTimestamp参数一直变,导致百度小程序抓取时将一个地址当作N个页面来抓取了。

参数一变,就当成不同资源了,作为百度蜘蛛来说没错,但是作为小程序这边,相同的资源,内容没有发生变化,或者说内容是静态的情况下,确实不应该加timestamp,否则对于cache也不友好

@Chen-jj
Copy link
Contributor

Chen-jj commented Apr 27, 2022

作为小程序来说,Taro 只知道 onLoad 触发了,并且能接收 options 参数,并不知道有蜘蛛来抓。

原因应该就是多次对 url encode 造成的,或许他们需要一个 encode 是幂等的 url。

@yuconora
Copy link
Contributor

yuconora commented May 9, 2022

同样遇到这个问题 目前有几个比较畸形的解决方式

1. urlencode的时候会把 "$" 符号编码,解决方式:"$"替换成一个不会被编码的 "_" 或者其它的符号

options.$taroTimestamp = Date.now()

// 换成 _taroTimestamp 来标记 不知道去掉这个会不会有影响。。。
options._taroTimestamp = Date.now()

2. 做了一点测试 百度小程序onInit生命周期比onLoad生命周期要提前

config.page[0] = 'onInit'

// 这里 直接还原成 onLoad 会损失一部分性能
config.page[0] = 'onLoad'

@Chen-jj 大佬有时间看下 还有没有更合理的方案

@Chen-jj
Copy link
Contributor

Chen-jj commented May 9, 2022

@yuconora $ 改为 _ 可以的,没有副作用,但即使不被编码还是会生成这样的长串吧?

另外这还和 onInit 有关系么?

@bigmeow
Copy link
Member

bigmeow commented May 9, 2022

@Chen-jj 神策统计这边也会抓取到$taroTimestamp参数, 在统计某个带参数的页面时, 由于$taroTimestamp时间戳值不一样, 导致统计时无法统计准确。 所以想知道,$taroTimestamp 目前的作用是? 是否可以干掉或者考虑让用户自己去开启或者关闭?
像神策这种第三方统计的SDK一般都是通过获取当前的路由参数来获取页面参数, 例如下图所示属性:
image

@yuconora
Copy link
Contributor

@Chen-jj

百度小程序onInit 和onLoad 测试流程大概是这样的

  1. taro 新建一个项目 选取 taro-hooks 模板
taro init test
  1. 打开百度开发工具并导入小程序目录 正常开启 可看到页面参数这一栏会出现 $taroTimestamp 参数

未修改-百度

  1. 修改 node_modules/@tarojs/plugin-platform-swan/dist/runtime.js 242 行代码 把config.page[0] 赋值为 "onLoad"

Snipaste_2022-05-10_17-00-43

  1. 重新编译项目

修改后

  1. 可以看到 $taroTimestamp 参数消失了
    猜测百度小程序生命周期onInit里面修改options可能会影响到页面参数 (而分享web化这一操作会对 页面参数 这里进行 一次urlencode 浏览器页面刷新一次就会重新urlencode一次 详见第七条操作)

生命周期mark

  1. 做一个对比 百度小程序 新建一个原生页面
    不做任何修改 页面参数正常

origin

只在onInit 里面修改options 参数 与第二条一致 会出现$taroTimestamp 参数
onInit
只在onLoad 里面修改 与第四条一致 不会出现 $taroTimestamp 参数
onLoad

  1. 另附上出现多次urlencode的复现操作(使用百度代码片段方式模拟)
    导入百度开发工具 填上测试Appid
swanide://fragment/43be9b7af794457c29f25c82e398a1b11652178051043

选择预览->分享web化 -> 浏览器预览
share

在浏览器中多次刷新 就会出现长连接
大致的过程如下
刷新->页面添加新的$taroTimestamp 参数(最开始的已经编码成%24taroTimestamp 不会被认定成 $taroTimestamp,所以会添加新的) ->url编码页面参数(包含前面已编码过的"$" , 多次刷新,多次编码)

onInit里面 修改为_taroTimestamp 则不会出现长连接(onLoad里面修改则不影响页面参数这一部分)

所以会猜测与onInit有关 Taro转换成小程序页面的实现目前没深入理解😂 才会有以上比较畸形的解决方式

@oyvfhp
Copy link

oyvfhp commented May 11, 2022

@yuconora $可以_的,没有反对,但即使不被编码还是会生成这样的长串吧?

这还有onInit什么关系?

@Chen-jj $符号导致重复抓取的问题已经百度小程序进行了沟通,确实是有问题,他们会排期解决这个问题。
但对于 @yuconora 反馈的问题,确实想知道一下为何要加$taroTimeStamp参数,百度小程序那边也想知道,不然就算处理了$号的问题,导致业务的其他问题不一定能处理。

@Chen-jj
Copy link
Contributor

Chen-jj commented May 11, 2022

@yuconora 感谢提供详细的测试说明。同时根据 @bigmeow 提供的场景,的确不应该修改 options 对象,我们尝试换一种实现的。

@Chen-jj Chen-jj self-assigned this May 11, 2022
@Chen-jj Chen-jj added good first issue Good for newcomers P-1 High, patch labels May 11, 2022
@taro-bot2 taro-bot2 bot modified the milestone: 3.4.10 May 11, 2022
@tourze
Copy link
Contributor

tourze commented May 12, 2022

关注

Chen-jj added a commit that referenced this issue May 23, 2022
* fix(runtime): 调整路由参数逻辑, fix #11713

* fix: ci

* fix: ci
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
F-react Framework - React good first issue Good for newcomers P-1 High, patch T-swan Target - 编译到百度小程序 V-3 Version - 3.x
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants