python写微信脚本_使用python编写微信跳一跳的自动脚本

#!/usr/bin/env python#-*- coding: utf-8 -*-

from PIL importImage, ImageDrawimportmathimportosimporttimeimportsubprocess#小小人底部RGB

role_bottom_rgb = (58, 58, 102)#小小人头部RGB

role_top_rgb = (65, 65, 90)#白色中心点 RGB

white_point = (245, 245, 245)#按压系数

press_coefficient = 1.35

defget_screenshot():"""获取截图信息

:return:"""process= subprocess.Popen('adb shell screencap -p', shell=True,

stdout=subprocess.PIPE)

binary_screenshot=process.stdout.read()

binary_screenshot= binary_screenshot.replace(b'\r\r\n', b'\n')

with open('autojump.png', 'wb') as f:

f.write(binary_screenshot)

time.sleep(1)

img= Image.open('autojump.png')returnimgdef is_similar(rgb1, rgb2, degree=20):"""判断颜色是否相近

:param rgb1:

:param rgb2:

:param degree:

:return:"""

return abs(rgb1[0] - rgb2[0]) <= degree andabs(

rgb1[1] - rgb2[1]) <= degree and abs(rgb1[2] - rgb2[2]) <=degreedefcalculate_jump_distance(img):"""计算跳一跳的距离

:param image:

:return:"""draw=ImageDraw.Draw(img)

im_pixel=img.load()

w, h=img.size#设置有效扫描区域

min_x = 100max_x= w - 10min_y= 400max_y= h - 100

#step1:寻找小小人底座位置

role_start_x =0

role_end_x=0

role_y=0

find_role=False#y轴从下往上扫描

for y in range(max_y, min_y, -1):#找到小小人最低部一行,退出y轴循环

iffind_role:break

#y轴未找到最低一行,则继续遍历x轴元素点

#x轴从左到右扫描

for x inrange(min_x, max_x):

current_rgb= im_pixel[x, y] #当前像素RGB值

#寻找到小人底座首位像素点

if is_similar(current_rgb, role_bottom_rgb, 5):if not find_role: #找到首位像素点

find_role =True

role_start_x=x

role_y= y #小人底座中心点的y轴坐标已确定

#小人底座最右侧像素点定位,条件:首位像素点已找到,在当前y轴上继续遍历x轴,当当前像素不在小小人中时,前一个像素点为底座最右点

if find_role and not is_similar(current_rgb, role_bottom_rgb, 5):

role_end_x= x - 1

break

#小小人底座中心点

role_x = (role_start_x + role_end_x) / 2role=(role_x, role_y)

draw.point([role], fill=(255, 0, 0))#step2:寻找棋盘顶点:从上往下,从左到右扫描,寻找首位与初始点不一样的像素

#解决小小人头部出现在最顶部时的BUG,在x轴扫描时,跳过小小人位置[role_start_x,role_end_x]

top_x =0

top_y=0

top_rgb=None

role_top_flag=Falsefor y inrange(min_y, max_y):for x inrange(min_x, max_x):

current_rgb=im_pixel[x, y]#首先出现小小人的头部

if notrole_top_flag:if is_similar(current_rgb, role_top_rgb, 40):print("首先出现小小人头部!")

role_top_flag=Truecontinue

#当小小人头部在最顶部时,从上到下扫描时,当x处于小小人位置中时,跳过本次循环

if (role_start_x - 50 <= x <= role_end_x + 50) androle_top_flag:#当x轴坐标在小小人位置时

continue

#顶部既不是小小人,又与初始像素点不一样,则定位为棋盘顶部,退出x轴扫描

if notis_similar(current_rgb, im_pixel[min_x, min_y],20): #与背景像素点不一样

top_x =x#解决棋盘边上出现一条乱七八糟颜色点将棋盘围起来时的BUG,找到第一个差异点后y轴继续往下5个像素点作为顶点

top_y = y + 4top_rgb=im_pixel[top_x, top_y]break

if top_rgb: #找到与初始点不一样的像素点,退出y轴循环

breaktop=(top_x, top_y)

draw.point([top], fill=(255, 0, 0))#step3:寻找棋盘最右侧点,条件:从top_x 向右,top_y 向下扫描,当与棋盘顶部像素点相似,x轴最大时,所在点为最右点

right_x =top_x

right_y=top_y

find_border=False

check_rgb=top_rgbfor x inrange(top_x, max_x):for y inrange(top_y, max_y):

current_rgb=im_pixel[x, y]#找到相邻的相似元素点,定位条件:30个像素内,颜色相似

if is_similar(current_rgb, check_rgb, 20) andabs(

x- right_x) <= 5 and abs(y - right_y) <= 5:

check_rgb=current_rgb

find_border=True

right_x=x

right_y=ybreak

else:#如果当前y轴扫描完毕都没有遇到棋盘相似点(即没有遇到break),说明已经超出了最右侧棋盘点,退出x轴循环

iffind_border:breakright=(right_x, right_y)

draw.point([right], fill=(255, 0, 0))#step4:定位棋盘中心:扫描棋盘,判断是否存在中心白点,否则初略可认为棋盘中心点位置是顶点和右侧点交叉位置

border =(top_x, right_y)#先排除初略中心点位置与白色中心点相似的情况,否则遇到白色版面会定位错误

if not is_similar(im_pixel[top_x, right_y], white_point, 4):

find_white_point=Falsefor y in range(top_y + 5, right_y + 5):for x in range(top_x * 2 - right_x + 5, right_x - 5):if is_similar(im_pixel[x, y], white_point, 2):#寻找到白色中心点

find_white_point =True

border= (x, y + 10)print("寻找到白色中心点!")break

#寻找到白色中心点,退出y轴循环

iffind_white_point:breakdraw.point([border], fill=(255, 0, 0))#draw.line([top, right], fill=(255, 0, 0), width=10)

draw.line([role, top, right, border], fill=(255, 0, 0), width=10)#img.show()

img.save("debug.png")return math.sqrt((role[0] - border[0]) ** 2 + (role[1] - border[1]) ** 2)defjump(distance):

press_time= distance *press_coefficient

press_time= max(press_time, 200) #设置 200ms 是最小的按压时间

press_time =int(press_time)

cmd= 'adb shell input swipe 400 400 400 400 {duration}'.format(

duration=press_time)print(cmd)

os.system(cmd)returnpress_timeif __name__ == '__main__':

i= 1

#img = get_screenshot()

#img=Image.open('autojump.png')

#distance = calculate_jump_distance(img)

#img.close()

#jump(distance)

whileTrue:

img=get_screenshot()

distance=calculate_jump_distance(img)

jump(distance)

img.close()

i+= 1

if i == 10:

time.sleep(2)

time.sleep(2)print("*" * 100)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了编写微信自动回复脚本,我们可以使用itchat库,该库提供了对微信的接口,可以通过Python程序与微信进行交互。 以下是一个简单的微信自动回复脚本示例: ```python import itchat # 回复消息的函数 @itchat.msg_register(itchat.content.TEXT) def reply_msg(msg): if msg['FromUserName'] != myUserName: itchat.send_msg('自动回复:' + msg['Text'], msg['FromUserName']) # 登录微信 itchat.auto_login(hotReload=True) # 获取自己的用户名 myUserName = itchat.get_friends(update=True)[0]["UserName"] # 运行自动回复程序 itchat.run() ``` 这个脚本中,我们使用`itchat.msg_register()`方法注册了一个消息处理函数`reply_msg()`,当收到文本消息时,该函数会自动回复消息内容,并附加上“自动回复”前缀。同时我们使用`itchat.auto_login()`方法登录微信,然后使用`itchat.get_friends()`方法获取自己的用户名,并保存到变量`myUserName`中。最后,我们使用`itchat.run()`方法启动自动回复程序。 值得注意的是,为了使该脚本能够长时间运行,我们需要在登录时设置`hotReload=True`,这样可以让登录状态得到保存,避免重复扫码登录的情况发生。 当我们运行该脚本后,微信中的好友发送消息时,程序会自动回复消息内容,并附加上“自动回复”前缀。 ### 回答2: 使用Python编写微信自动回复脚本是可行的。首先,我们需要安装好Python的运行环境和相关的第三方库,如itchat。然后,通过编写Python脚本,我们可以实现对微信好友消息的监听和自动回复。 在脚本中,我们可以使用itchat库的API来实现微信的登录和消息的接收。通过捕获微信好友的文本消息,我们可以根据消息内容编写相应的逻辑来进行回复。例如,可以设置一些关键词回复,当好友发送包含特定关键词的消息时,自动回复相应的内容。 在编写脚本时,我们还可以使用正则表达式等高级技术来匹配和处理消息。例如,可以使用正则表达式来匹配特定格式的消息,并提取其中的信息用于回复。还可以利用其他Python的库来实现更复杂的逻辑,如将接收到的消息进行文本处理、分析等。 此外,我们还可以通过配置文件的方式,使脚本可以针对不同的好友或消息类型进行不同的回复。通过读取配置文件,可以灵活地设置回复规则,实现个性化的自动回复功能。 总结来说,使用Python编写微信自动回复脚本是一种方便且可行的方式。我们可以通过编写Python脚本,利用itchat库的API和其他Python的库,实现对微信好友消息的监听和自动回复,从而实现个性化和自动化的微信聊天机器人。 ### 回答3: 使用Python编写微信自动回复脚本需要先安装一些必要的库,比如itchat,它可以模拟微信网页版的操作。 首先,在命令行中安装itchat库,可以使用pip命令:pip install itchat 然后,在Python脚本中导入itchat库:import itchat 接着,使用itchat库的login()函数登录微信账号:itchat.login() 登录成功后可以调用itchat库的函数获取微信好友列表:itchat.get_friends() 接下来,可以使用itchat库的run()函数开启微信消息监听模式,实现自动回复功能:itchat.run() 在run()函数中,可以使用装饰器@itchat.msg_register()来装饰自定义的函数,这个函数将会在收到好友消息时被调用。通过这个函数可以进行消息的处理和回复。 例如,我们可以定义一个回复消息的函数reply_to_friend(msg),其中msg是一个字典包含了收到的消息的具体信息。在函数的内部可以根据消息的类型进行逻辑判断和回复。 最后,运行整个Python脚本,扫描二维码登录微信账号后,即可实现自动回复功能。 需要注意的是,使用微信自动回复脚本有一定的限制,比如在非越狱的iPhone上,微信有防撤回机制,导致不能自动回复撤回消息。同时,使用自动回复脚本也需要谨慎,不要违反微信使用规定,以免被封号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值