Shell脚本模拟用户行为刷App积分,学习娱乐之用,再加图像数字识别验证码登录

获取接口信息

  1. 逆向apk,可能加密了
  2. Fiddler 4抓包
  3. 其他

App或网站的积分规则

这里写图片描述

网站登录行为中,如果添加验证码的话,很麻烦,这里先跳过。

效果图

这里写图片描述
这里写图片描述这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

这里写图片描述

为减少用户账号的异常特征,收藏、订阅、评论之后都删除,日志记录没办法了
积分可以兑换,有个排名,也是一个接口调用而已,仅供个人学习、研究之用,请勿用于商业用途。

实现过程

模拟App登录

已经确定登录的URL和参数USERNAME&PASSWORD,POST提交,返回一个json,包含token,以下的操作均使用token代替用户名和密码作为参数

USERNAME=xxxxxx
PASSWORD=xxxxxx
login_url=xxxxx
#模拟登录
echo '++++++++++++++++++++++++++++登录++++++++++++++++++++++++++++++++++++++'
data=`curl -d "USERNAME=$USERNAME&PASSWORD=$PASSWORD" "$login_url"`

使用curl -d模拟POST提交,使用jq解析json格式的data,并替换掉两边的双引号

token=`echo $data|jq '.data'|sed 's/"//g'`
search_url=xxxxxx
#模拟获取文章
echo '++++++++++++++++++++++++++++获取文章++++++++++++++++++++++++++++++++++++++'
contents=`curl -d "&accessToken=$token&cuPage=1&adcode=xxxx" "$search_url"`

#设置操作的文章数
for_times=15
for((ii=0;ii<$for_times;ii++));
do
    jj=`expr $ii + 1`
    content_title_arr[$ii]=`echo $contents|jq '.data.abc['$jj'].title'`
    content_websitename_arr[$ii]=`echo $contents|jq '.data.abc['$jj'].websitename'`
    content_id_arr[$ii]=`echo $contents|jq '.data.abc['$jj'].articleId'`
    content_type_arr[$ii]=`echo $contents|jq '.data.abc['$jj'].type'`
done
#获取文章中相应字段
echo '++++++++++++++++++++++++++++处理所需字段++++++++++++++++++++++++++++++++++++++'
for((i=0;i<${#content_id_arr[*]};i++))
do
    content_id_arr[$i]=`echo ${content_id_arr[$i]} |sed 's/"//g'`
    content_type_arr[$i]=`echo ${content_type_arr[$i]} |sed 's/"//g'`
    content_title_arr[$i]=`echo ${content_title_arr[$i]} |sed 's/"//g'`
    content_title_arr[$i]=`echo ${content_title_arr[$i]} |sed 's/[ //g'`
    content_title_arr[$i]=`echo ${content_title_arr[$i]} |sed 's/ ]//g'`
    content_websitename_arr[$i]=`echo ${content_websitename_arr[$i]} |sed 's/"//g'`
done

#模拟阅读文章
echo '+++++++++++++++++++++++++++阅读文章+++++++++++++++++++++++++++++++++++'
#for((i=0;i<1;i++))
for((i=0;i<${#content_type_arr[*]};i++))
do
    content_detail=`curl -d "articleId=${content_id_arr[$i]}&TYPE=${content_type_arr[$i]}&accessToken=$token" "$content_detail_url"`
    index=$((i+1))
    echo '++++++++++++++++++++++++++++阅读文章:第'$index'篇    '${content_title_arr[$i]}
done

其它接口类似

完善


使用crontab设置一个定时任务

这里写图片描述

在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。


sleep 1 睡眠1秒
sleep 1s 睡眠1秒
sleep 1m 睡眠1分
sleep 1h 睡眠1小时


直接把用户名和密码明文写sh里不太好,简单可逆加密,遇到技术好的还是藏不住

一步加密代码:
echo "ibase=16; $(echo "gtalk@gmail.com" |xxd -ps -u)" |bc
得到:137514765985002236391382606438443478282

解密代码:
dc -e 137514765985002236391382606438443478282P
得到:gtalk@gmail.com

curl -d 显示的信息太多,修改为进度条样式:
curl  -# -d

修改后的脚本(u,p,r为错误占位值)

#!/bin/bash
u='393938972265586578744682'
p='30765298571722054944135433354'
r='167852555465201814248138704241983574790873686482887295919533834'
login_url=`dc -e ${r}P`'login/v1/loginCheck.do'
search_url=`dc -e ${r}P`'search/v1.do'
content_detail_url=`dc -e ${r}P`'search/v1/getContentById.do'
N=`dc -e ${u}P`
B=`dc -e ${p}P`
#模拟登录
echo '++++++++++++++++++++++++++++登录'
data=`sleep 1s;curl -# -d "USERNAME=$N&PASSWORD=$B" "$login_url"`
token=`echo $data|jq '.data'|sed 's/"//g'`
#模拟获取文章
echo '++++++++++++++++++++++++++++获取文章'
contents=`sleep 1s;curl -# -d "accessToken=$token&cuPage=1&adcode=370102" "$search_url"`

上面的积分中,网站登录积分在shell实现较复杂,上网搜一圈,初步思路是Asprise-OCR-Java识别验证码,curl -D /curl -b 保存cookies/调用cookies 维持同一个session,下午验证了一下,可行,再细化一下

  1. Maven生成可以直接运行的jar包的多种方式
  2. Asprise Ocr 15.3 完美破解版,完美解决试用期弹出对话框的问题,同时去除了单词使用100次调用的问题
  3. curl -o
  4. # 将文件下载到本地并命名为mygettext.html
    curl -o mygettext.html http://www.abc.com/ual/gettext.html
sleep_time=1s
#模拟PC登录
#1.获取cookies
pc_result_data_1=`sleep $sleep_time;curl -# -D pccookies $URL/login.do?redirectUrl=$URL/`
#2.保存验证码图片
pc_result_data_2=`sleep $sleep_time;curl -# -b pccookies -o code.png $URL/validateImg.do?d=0.48115387154622147`
#3.删除已存在的储存验证码txt
code_txt='code.txt'
path_=`pwd`
if [  -f "$code_txt" ]; then
    rm -f ${path_}/code.txt
fi
#4.识别验证码图片
export LD_LIBRARY_PATH=/usr/local/games/score;
pc_result_data_3=`sleep $sleep_time;java -jar Recognize-1.0-SNAPSHOT-jar-with-dependencies.jar ${path_}/code.png`
echo $pc_result_data_3
#5.模拟PC登录
N=`dc -e ${u}P`
B=`dc -e ${p}P`
code=`cat code.txt`
if [[ "$code" =~ "*" ]];then
    code_arr[0]=`echo $code|sed 's/*/9/g'`
    code_arr[1]=`echo $code|sed 's/*/0/g'`
else
    code_arr[0]=$code
fi
for((ii=0;ii<${#code_arr[*]};ii++));
do
    pc_result_data_4=`sleep $sleep_time;curl -# -b pccookies  -d "userId=$username_base64&password=$password_base64&remember=true&validCode=$code_arr[$ii]&redirectUrl=$URL/" "$URL/loginCheck.do"`
    pc_result_data_5=`sleep $sleep_time;curl -# -b pccookies "$URL/main.do"`
done

问题1:

>>> UnsatisfiedLinkError occurs. To fix it, visit http://asprise.com/ocr/fix-link-error?os=Linux
Dependency information:     linux-vdso.so.1 =>  (0x00007fffd3532000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fdb4f73b000)
    librt.so.1 => /lib64/librt.so.1 (0x00007fdb4f532000)
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fdb4f22c000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fdb4efa8000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fdb4ec13000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fdb51bbf000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fdb4e9fd000)
LD_LIBRARY_PATH=/usr/local/games/score
java.library.path=/usr/local/games/score:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
OS: Linux 2.6.32-431.el6.x86_64 amd64
Linux host-10-20-5-112 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
JVM: 1.7.0_67-b01 64bit by Oracle Corporation

java.lang.UnsatisfiedLinkError: /tmp/libaocr_x64.so: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /tmp/libaocr_x64.so)
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1851)
    at java.lang.Runtime.load0(Runtime.java:795)
    at java.lang.System.load(System.java:1062)
    at com.asprise.ocr.util.OcrLibHelper.loadOcrLib(OcrLibHelper.java:64)
    at com.asprise.ocr.Ocr.<clinit>(Ocr.java:474)
    at com.gch.Test01Recognize.recognize(Test01Recognize.java:36)
    at com.gch.Test01Recognize.main(Test01Recognize.java:30)

>>> Relax, it's easy to fix: http://asprise.com/ocr/fix-link-error?os=Linux
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.asprise.ocr.Ocr.doSetup(Z)I
    at com.asprise.ocr.Ocr.doSetup(Native Method)
    at com.asprise.ocr.Ocr.setUp(Ocr.java:508)

解决:下载 libstdc++.so.6
export LD_LIBRARY_PATH=/usr/local/libstdc++.so.6文件地址;

问题2:NOTICE: Asprise OCR - strictly for evaluation only. All Rights Reserved (C) asprise.com NOTICE: this evaluation version replaces all recognized ‘q’, ‘x’, ‘0’, and ‘9’ occurrences with asterisk (‘*’).
解决:破解或者echo $code|sed ‘s/*/9/g 替换
问题3:登录后没有登录分数,排查后发现积分拦截的路径不是loginCheck.do,而是登录成功后main.do

 pc_result_data_4=`sleep $sleep_time;curl -# -b pccookies  -d "userId=$username_base64&password=$password_base64&remember=true&validCode=$code_arr[$ii]&redirectUrl=$URL/" "$URL/loginCheck.do"`

解决:
pc_result_data_5=sleep sleep_time;curl -# -b pccookies "URL/main.do”“


总结起来就是接口地址参数收集,返回json解析,使用shell实现而已
仅供个人学习、研究、娱乐之用

原文地址:https://www.cnblogs.com/llhl/p/9648648.html