Import "zm.luae"
Import "jsdvip.luae"
Import "ShanHai.lua"
If jsdvip.StartServer() Then
TracePrint "恭喜你!!可以使用插件"
Else
TracePrint "很遗憾!!!您的设备不支持jsd节点相关功能"
End If
/*----------------------------------------------*/
Dim Ret,Info(),记录值="",商品标题,商品口令,已完成,标题坐标(),顶部坐标(),底部坐标(),中心坐标(),分割,下标,是否变动,进入采集区,执行条件,h
h=Thread.Start(弹窗处理线程)
Call 主程序()
Thread.Stop(h)
Function 主程序()
Do
If jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/qig').desc('商品列表')") Then
Call 抖音直播数据采集()
ElseIf jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/fpa')") Then
Call 抖音橱窗数据采集()
ElseIf jsdvip.FindNode("By.res('com.smile.gifmaker:id/search_content')") and jsdvip.FindNode("By.text('商品')") Then
Call 快手商品页采集()
ElseIf jsdvip.FindNode("By.res('com.smile.gifmaker:id/skin_container')") Then
Call 快手直播页采集()
Else
ShowMessage "未检测到数据采集页面,请手动切换!"
End If
Delay 100
Loop
End Function
Function 抖音直播数据采集()
判断新页面 ("By.res('com.ss.android.ugc.aweme:id/qig').desc('商品列表')")
Do
顶部坐标 = jsdvip.GetRect("By.res('com.ss.android.ugc.aweme:id/haj')")
底部坐标 = jsdvip.GetRect("By.res('com.ss.android.ugc.aweme:id/rx_')")
中心坐标 = jsdvip.GetPoint("By.res('com.ss.android.ugc.aweme:id/rx_')")
If 顶部坐标 <> Null and 底部坐标 <> Null And 中心坐标 <> Null Then
Exit Do
Else
ShowMessage "获取坐标中~"
End If
Loop
Do Until 执行条件 = true
Ret = jsdvip.FindNodeS("By.res('com.ss.android.ugc.aweme:id/tv_title')","node")
If Ret Then
Info = jsdvip.GetNodeInfoAll("node")
If Info <> Null Then
For i = 1 To UBOUND(Info[1]) + 1
商品标题 = Info[1][i]
是否变动 = jsdvip.FindNode("By.text('" & 商品标题 & "')")
If InStr(1, 记录值, 商品标题) = 0 and 是否变动 Then
记录值 = 记录值 & "----" & 商品标题
TracePrint 商品标题
Call 位置计算(商品标题,顶部坐标[4],底部坐标[4], 100)
If 抖音直播进入商品页(商品标题)=True Then
商品口令 = 获取口令()
Call 保存口令(商品口令, "抖音橱窗数据-"&DateTime.Format("%Y-%m-%d"))
Call DY返回商品主页("By.res('com.ss.android.ugc.aweme:id/qig').desc('商品列表')")
End If
ElseIf 是否变动 = Null Then
Exit For
End If
Next
End If
End If
If jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/qig').desc('商品列表')") Then
Call 抖音直播滑动(商品标题)
执行条件 = jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/wp4')")
End If
Delay 100
Loop
End Function
Function 抖音橱窗数据采集()
Do
顶部坐标 = jsdvip.GetRect("By.res('com.ss.android.ugc.aweme:id/y6=')")
底部坐标 = jsdvip.GetRect("By.res('com.ss.android.ugc.aweme:id/fpb')")
中心坐标 = jsdvip.GetPoint("By.res('com.ss.android.ugc.aweme:id/fpb')")
If 顶部坐标 <> Null and 底部坐标 <> Null And 中心坐标 <> Null Then
Exit Do
Else
ShowMessage "获取坐标中~"
End If
Loop
Do Until 执行条件 = True
Ret = jsdvip.FindNodeS("By.res('com.ss.android.ugc.aweme:id/tye')","node")
If Ret Then
Info = jsdvip.GetNodeInfoAll("node")
For i = 0 To UBOUND(Info[1])
jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/tye')",i,"nodetitle")
jsdvip.FindChlid("nodetitle", "By.res('com.ss.android.ugc.aweme:id/ty0')", "newnode")
商品标题 = jsdvip.GetText("newnode", 0)
分割 = Split(商品标题, "\n")
商品标题 = 分割[1]&分割[2]
If InStr(1, 记录值, 商品标题) = 0 and 商品标题 <>"" Then
记录值 = 记录值 & "----" & 商品标题
TracePrint 商品标题
Call DY位置计算 (i, 顶部坐标[4], 底部坐标[4], 150)
Call DY橱窗进入商品页(i)
商品口令 = 获取口令()
TracePrint 商品口令
Call 保存口令(商品口令, "抖音橱窗数据-"&DateTime.Format("%Y-%m-%d"))
Call DY返回商品主页("By.res('com.ss.android.ugc.aweme:id/fpm')")
End If
Next
End If
Call DY橱窗滑动()
执行条件 = jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/fn8')")
Loop
End Function
Function 抖音直播滑动(商品标题)
Dim 底部坐标(),盒高()
盒高 = jsdvip.GetRect("By.res('com.ss.android.ugc.aweme:id/jie')")
If 盒高 <> null Then
TouchDown 盒高[3]/2, 盒高[4],1
TouchMove 盒高[3]/2, 盒高[2],1,1000
TouchUp 1
Else
ShowMessage "未获取到有效坐标"
End If
End Function
Function 抖音直播进入商品页(商品标题)
Dim 坐标(),开始时间
jsdvip.Click ("By.text('" & 商品标题 & "')")
开始时间 = TickCount()
Do
If jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/vbh')") Then //抖音分享点击
坐标 = jsdvip.GetPoint("By.res('com.ss.android.ugc.aweme:id/vbh')")
If 坐标 <> Null Then
Tap 坐标[1] + 20, 坐标[2]
End If
ElseIf jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/abe')") Then //抖音商品页面进入
坐标 = jsdvip.GetRect("By.res('com.ss.android.ugc.aweme:id/abe')")
If 坐标 <> Null Then
Swipe 坐标[1]+100, 坐标[2]-100, 坐标[1]+100, 坐标[2] - 600, 500
End If
ElseIf jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/sz-').text('复制链接')")//复制链接
jsdvip.Click ("By.res('com.ss.android.ugc.aweme:id/sz-').text('复制链接')")
抖音直播进入商品页 = True
Exit Do
ElseIf jsdvip.FindNode("By.text('请勿离开直播间,否则抽奖资格失效')") Then//福袋抽奖
KeyPress "Back"
抖音直播进入商品页 = False
Call DY返回商品主页("By.res('com.ss.android.ugc.aweme:id/qig').desc('商品列表')")
Exit Do
Else
If TickCount() - 开始时间 > 5000 Then
ShowMessage "超时返回"
抖音直播进入商品页 = False
Exit Do
ElseIf jsdvip.GetText("By.clazz('android.widget.TextView').depth('14')", 0) <> 商品标题 and jsdvip.GetText("By.clazz('android.widget.TextView').depth('14')", 0) <>Null Then
ShowMessage "目标不匹配"
Call DY返回商品主页("By.res('com.ss.android.ugc.aweme:id/qig').desc('商品列表')")
Exit Do
End If
End If
Delay 100
Loop
End Function
Function DY位置计算(下标,顶部坐标Y,底部坐标Y,容错)
标题坐标 = jsdvip.GetPoint("By.res('com.ss.android.ugc.aweme:id/tye')",下标)
If 标题坐标 <> Null Then
If 标题坐标[2] < 顶部坐标Y Then
TouchDown 中心坐标[1], 中心坐标[2],1
TouchMove 中心坐标[1], 中心坐标[2]+(顶部坐标Y-标题坐标[2])+容错,1,500
TouchUp 1
ElseIf 标题坐标[2] > 底部坐标Y Then
TouchDown 中心坐标[1], 中心坐标[2],1
TouchMove 中心坐标[1], 中心坐标[2]-(标题坐标[2]-底部坐标Y)-容错,1,500
TouchUp 1
End If
End If
End Function
Function DY橱窗滑动()
If 底部坐标 <> null and 顶部坐标 <> null Then
TouchDown 底部坐标[3] -250, 底部坐标[4] - 50, 1
TouchMove 顶部坐标[1], 顶部坐标[2]-50,1,1500
TouchUp 1
Else
Swipe(GetScreenX()/2,GetScreenY()/2,GetScreenX()/2,GetScreenY()/2-200,1000)
End If
End Function
Function DY橱窗进入商品页(下标)
Dim 坐标()
jsdvip.Click ("By.res('com.ss.android.ugc.aweme:id/tye')",下标)
Do
If jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/vbh')") Then //抖音分享点击
坐标 = jsdvip.GetPoint("By.res('com.ss.android.ugc.aweme:id/vbh')")
If 坐标 <> Null Then
Tap 坐标[1]+20,坐标[2]
End If
ElseIf jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/sz-').text('复制链接')") Then
jsdvip.Click("By.res('com.ss.android.ugc.aweme:id/sz-').text('复制链接')")
Exit Do
Else
ShowMessage "等待加载中"
End If
Loop
End Function
Function DY返回商品主页(退出节点)
Do
If jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/iwc')") Then
jsdvip.Click ("By.res('com.ss.android.ugc.aweme:id/iwc')")//关闭分享
ElseIf jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/adt')") Then
jsdvip.Click ("By.res('com.ss.android.ugc.aweme:id/adt')")//详情页面返回
ElseIf jsdvip.FindNode("By.text('请勿离开直播间,否则抽奖资格失效')") Then//福袋抽奖
TracePrint "By.text('一键发表评论')"
KeyPress "Back"
ElseIf jsdvip.FindNode(退出节点) Then
Exit Do//商品主页退出
Else
ShowMessage "等待返回首页"
End If
Loop
End Function
Function 快手商品页采集()
判断新页面 ("By.res('com.smile.gifmaker:id/search_content')")
判断新页面 ("By.text('商品')")
Do
顶部坐标 = jsdvip.GetRect("By.clazz('android.view.ViewGroup').pkg('com.smile.gifmaker').depth('35')",0)
底部坐标 = jsdvip.GetRect("By.clazz('android.widget.FrameLayout').pkg('com.smile.gifmaker').depth('8')",3)
中心坐标 = jsdvip.GetPoint("By.res('com.smile.gifmaker:id/krn_content_container')")
If 顶部坐标 <> Null and 底部坐标 <> Null And 中心坐标 <> Null Then
Exit Do
Else
ShowMessage "获取坐标中~"
End If
Loop
Do Until 执行条件 = True
Ret = jsdvip.FindNodeS("By.depth('42').clazz('android.widget.TextView')","node")
If Ret Then
Info = jsdvip.GetNodeInfoAll("node")
For i = 1 To UBOUND(Info[1]) + 1
If jsdvip.FindLv("By.text('" & Info[1][i] & "').depth('42')", 0, "node1")=True Then
商品标题 = jsdvip.GetText("node1",0)
If InStr(1, 记录值, 商品标题) = 0 and IsNumeric(Right(商品标题,Len(商品标题)-1)) = False Then
TracePrint 商品标题
Call 位置计算(商品标题,顶部坐标[4],底部坐标[2],150)
进入采集区 = 进入商品页(商品标题)
If 进入采集区 = true Then
Delay 500
商品口令 = 获取口令()
Call 保存口令(商品口令, "快手店铺数据-" & DateTime.Format("%Y-%m-%d"))
记录值 = 记录值 & "----" & 商品标题
Call 返回商品主页("By.text('商品').clazz('android.widget.TextView')")
Elseif 进入采集区 = False Then
Call 返回商品主页("By.text('商品').clazz('android.widget.TextView')")
End If
End If
End If
Next
End If
Call 快手店铺滑动(商品标题)
执行条件 = jsdvip.FindNode("By.text('没有更多内容啦').depth('35')")
Loop
End Function
Function 快手直播页采集()
判断新页面 ("By.res('com.smile.gifmaker:id/skin_container')")
Do
顶部坐标 = jsdvip.GetRect("By.res('com.smile.gifmaker:id/view_pager_container')")
底部坐标 = jsdvip.GetRect("By.res('com.smile.gifmaker:id/view_pager_container')")
中心坐标 = jsdvip.GetPoint("By.res('com.smile.gifmaker:id/view_pager_container')")
If 顶部坐标 <> Null and 底部坐标 <> Null And 中心坐标 <> Null Then
Exit Do
Else
ShowMessage "获取坐标中~"
End If
Loop
Do Until 执行条件 = True
Ret = jsdvip.FindNodeS("By.depth('25').clazz('android.widget.TextView')","node")
If Ret Then
Info = jsdvip.GetNodeInfoAll("node")
For i = 1 To UBOUND(Info[1]) + 1
If Info[1][i] <> "看讲解" And Info[1][i] <> "讲解中" And Info[1][i] <> "求讲解" And IsNumeric(Info[1][i]) = false Then
商品标题 = Info[1][i]
If InStr(1, 记录值, 商品标题) = 0 Then
TracePrint 商品标题
Call 位置计算(商品标题, 顶部坐标[2], 底部坐标[4], 150)
进入采集区 = 进入商品页(商品标题)
If 进入采集区 = true Then
Delay 500
商品口令 = 获取口令()
TracePrint 商品口令
Call 保存口令 (商品口令, "快手直播数据-" & DateTime.Format("%Y-%m-%d"))
记录值 = 记录值 & "----" & 商品标题
Call 返回商品主页("By.res('com.smile.gifmaker:id/skin_container')")
Elseif 进入采集区 = False Then
Call 返回商品主页 ("By.res('com.smile.gifmaker:id/skin_container')")
End If
End If
End If
Next
End If
Call 快手直播滑动 (商品标题)
执行条件 = jsdvip.FindNode("By.res('com.smile.gifmaker:id/no_more_tv').text('划到底了,赶快下单吧')")
Loop
End Function
Function 快手店铺滑动(商品标题)
TracePrint "店铺采集滑动"
If 底部坐标 <> Null And 顶部坐标 <> Null Then
TouchDown GetScreenX()/2, 底部坐标[2]-50,1
TouchMove GetScreenX()/2, 顶部坐标[4]+50,1,1000
TouchUp 1
End If
End Function
Function 快手直播滑动(商品标题)
TracePrint "直播采集滑动"
If 底部坐标 <> Null And 顶部坐标 <> Null Then
TouchDown GetScreenX()/2, 底部坐标[4] - 10, 1
TouchMove GetScreenX()/2, 顶部坐标[2]-10,1,1000
TouchUp 1
End If
End Function
Function 进入商品页(商品标题)
Dim 坐标(), 点击进入=false,点击分享 = false, 详情页缩小 = false, 复制链接 = false, 商品回放 = false,newtitle
Do
If 点击进入 = false Then
If jsdvip.Click("By.text('" & 商品标题 & "')") Then
点击进入 = True
Else
进入商品页 = False
Exit Do
End If
End If
If 商品回放 = false Then
If jsdvip.FindNode("By.res('com.smile.gifmaker:id/title_tv').text('商品讲解回放')") Then //有商品回放点击商品链接
If jsdvip.Click("By.text('" & 商品标题 & "')") Then
商品回放 = True
End If
End If
End If
If 点击分享 = false Then
If jsdvip.FindNode("By.res('com.smile.gifmaker:id/share_btn_opaque')") Then //点击分享
If jsdvip.Click ("By.res('com.smile.gifmaker:id/share_btn_opaque')") Then
点击分享 = True
End If
End If
End If
If 详情页缩小 = false And 点击分享 = false Then
If jsdvip.FindNode("By.res('com.smile.gifmaker:id/detail_V2_root_main_bottom_id')") Then //详情页缩小的要滑动一下
坐标 = jsdvip.GetRect("By.res('com.smile.gifmaker:id/detail_V2_root_main_bottom_id')")
If 坐标 <> Null Then
Swipe 坐标[1] + 100, 坐标[2] - 100, 坐标[1] + 100, 坐标[2] - 600, 500
详情页缩小 = True
End If
ElseIf jsdvip.FindNode("By.res('com.smile.gifmaker:id/self_detail_bottom_bar_action_layout')")//详情页缩小的要滑动一下
坐标 = jsdvip.GetRect("By.res('com.smile.gifmaker:id/self_detail_bottom_bar_action_layout')")
If 坐标 <> Null Then
Swipe 坐标[1] + 100, 坐标[2] - 150, 坐标[1] + 100, 坐标[2] - 650, 500
详情页缩小 = True
End If
End If
End If
If 复制链接 = false and 点击分享 = True Then //复制链接
If jsdvip.FindNode("By.res('com.smile.gifmaker:id/title').text('复制链接')") Then
jsdvip.Click("By.res('com.smile.gifmaker:id/title').text('复制链接')")
复制链接 = true
进入商品页 = True
Exit Do
End If
End If
ShowMessage "等待加载中"
Loop
End Function
Function 位置计算(商品标题,顶部坐标Y,底部坐标Y,容错)
TracePrint "位置计算:",顶部坐标Y,底部坐标Y
标题坐标 = jsdvip.GetPoint("By.text('" & 商品标题 & "')")
If 标题坐标 <> Null Then
If 标题坐标[2] < 顶部坐标Y Then
TracePrint "太靠上了,下移一点"
TouchDown 中心坐标[1], 中心坐标[2],1
TouchMove 中心坐标[1], 中心坐标[2]+(顶部坐标Y-标题坐标[2])+容错,1,500
TouchUp 1
ElseIf 标题坐标[2] > 底部坐标Y Then
TracePrint "太靠下了,上移一点"
TouchDown 中心坐标[1], 中心坐标[2],1
TouchMove 中心坐标[1], 中心坐标[2]-(标题坐标[2]-底部坐标Y)-容错,1,500
TouchUp 1
End If
End If
End Function
Function 返回商品主页(退出节点)
Do
If jsdvip.FindNode("By.res('com.smile.gifmaker:id/back_btn_trans')") Then
jsdvip.Click ("By.res('com.smile.gifmaker:id/back_btn_trans')")//回放详情页返回
ElseIf jsdvip.FindNode("By.res('com.smile.gifmaker:id/title_tv').text('商品讲解回放')") Then
jsdvip.Click ("By.res('com.smile.gifmaker:id/right_btn')")//回放页面返回
ElseIf jsdvip.FindNode("By.res('com.smile.gifmaker:id/back_btn_opaque')") Then
jsdvip.Click("By.res('com.smile.gifmaker:id/back_btn_opaque')")//无回放页面返回
ElseIf jsdvip.FindNode(退出节点) Then
Exit Do//商品主页退出
Else
ShowMessage "等待返回首页"
End If
Loop
End Function
Function 获取口令()
Dim 商品口令
商品口令 = Sys.GetClipText()
If 商品口令 <> "" Then
获取口令() = 商品口令
Else
商品口令 = Dialog.InputBox("口令处理:")
获取口令() = 商品口令
End If
End Function
Function 保存口令(商品口令, 文件名)
Dim 文件路径,是否存在
文件路径 = "/sdcard/AnjianPdata/" & 文件名 & ".txt"
是否存在 = Dir.Exist(文件路径)
If 是否存在 = 2 Then
zm.FileCreate(文件路径)
ElseIf 是否存在 = 0 Then
zm.DirCreate("/sdcard/AnjianPdata/")
zm.FileCreate(文件路径)
End If
zm.FileWriteAppend(文件路径, 商品口令)
End Function
Function 判断新页面(节点)
Do
If jsdvip.FindNode(节点) Then
判断新页面 = True
Exit Do
ElseIf jsdvip.FindNode("By.res('com.ss.android.ugc.aweme:id/hdl')") Then
jsdvip.Click ("By.res('com.ss.android.ugc.aweme:id/hdl')")//抖音关闭直播小窗体
Else
ShowMessage "等待新页面"
End If
Loop
End Function
Sub 弹窗处理线程()
dim 运行条件
jsdvip.StartServer()
Do
If jsdvip.FindNode("By.text('口令处理:')") Then
If jsdvip.LongClick("By.clazz('android.widget.EditText')", 2000) Then
If jsdvip.Click("By.clazz('android.widget.TextView').text('粘贴')") Then
Delay 500
jsdvip.Click ("By.clazz('android.widget.Button').text('确定')")
End If
End If
End If
Delay 100
Loop
End Sub