改进版在此:http://blog.csdn.net/lsjweiyi/article/details/79203722
事先说明:这只是帮助你百度题目,并没有直接给你答案什么的,作用应该是能帮助你找到3 5 到题的答案而已,剩下一些题目还得靠自己,谈不上作弊。其次,这个脚本依赖网络比较多,毕竟要调用百度的api。当然还有浏览器的启动速度,毕竟答题就那么10秒。
然而,此时的这些答题游戏的奖金已经只有几块钱了,当初让我有想法的时候还是几十几百的,现在这样做,价值不高了。
思路:利用软件对手机截屏 ,并实时保存到电脑上,软件会自动创建一个文件夹(Pictures,原来是不存在的,当然这里你需要修改图片存储的路径),然后脚本检测到这个文件夹创建成功了,就表示截屏了,下来就进行识别。识别利用百度的在线ocr(不是卖广告,说实在的,尽管没开源,好歹给我这种业余爱好者一个解决方案,关键每天有免费次数,识别速度也快,还有更好的,请不吝赐教),然后把识别的文字百度并在浏览器打开。
关于百度的AI平台:ocr地址:http://ai.baidu.com/tech/ocr/general。具体怎么用自己看看文档吧(说的一般吧),脚本里需要一些key,我就提一下怎么获得这里的key,在上面的网址找到登录,然后找到图片里的位置:
然后创建应用,然后摸索吧,就会有那些key了。
关于手机连接电脑的软件我就随便找了个叫totalControl的,好不好我不知道,我就随便找的,反正目的就是能把手机实时截屏并上传,手机屏幕分辨率适用1920*1080,可以换别的软件,不过不要忘了根据实际修改相关的地方。
贴代码,Python版本2.7.13,有一些库需要安装,自己去安装吧,win32的库,地址:http://download.csdn.net/download/xgin1/9392606
# _*_ coding:UTF-8 _*_
import win32con
import ctypes
import ctypes.wintypes
import threading
import time
import os
from PIL import Image
from aip import AipOcr#百度的api,百度官网有教程
import base64
import shutil
import string
import urllib
import urllib2
#热键功能,独立的一个线程
class Hotkey(threading.Thread): #创建一个Thread.threading的扩展类
def run(self):
global EXIT #定义全局变量,这个可以在不同线程间共用
user32 = ctypes.windll.user32 #加载user32.dll
try:
if not user32.RegisterHotKey(None, ID, 0, HOTKEY): # 注册快捷键F10并判断是否成功,该热键用于结束程序,且最好这么结束,否则影响下一次注册热键。
print "Unable to register id", ID # 返回一个错误信息
#以下为检测热键是否被按下,并在最后释放快捷键
msg = ctypes.wintypes.MSG()
while True:
if user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:
if msg.message == win32con.WM_HOTKEY:
if msg.wParam == ID:
EXIT=True
return
user32.TranslateMessage(ctypes.byref(msg))
user32.DispatchMessageA(ctypes.byref(msg))
finally:
user32.UnregisterHotKey(None, ID)#必须得释放热键,否则下次就会注册失败,所以当程序异常退出,没有释放热键,
#那么下次很可能就没办法注册成功了,这时可以换一个热键测试
class Ans():
def main(self):
im_name=os.listdir(path)#获取图片名
self.cut()#对图片进行裁剪
f=open('im.jpg','rb')#二进制方式打开图文件
image=f.read()#这里好像必须命名为image,百度的api限定,有点不能理解,有待考察
#im=base64.b64encode(f.read()) #读取文件内容,转换为base64编码
#这里是每个百度云账号独立的一些ID,你需要自己去弄你自己的
APP_ID='你的ID'
API_KEY='你的KEY'
SECRET_KEY='你的SECRET_KEY'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)#这个就是百度的api,可以获取一个相当于实例对象的东西,可以调用函数
information=client.basicGeneral(image)#ocr函数,打印出来是json格式的
STR=''#存储识别出来的文字
for i in range(0,information['words_result_num']):#根据格式得出来的循环
STR+=information['words_result'][i]['words'].encode('utf-8')
#下面几行是对得到的字符串做一些处理,去掉一些符号,因为百度搜索限制38个字以内,个人觉得这里写的很丑,无奈没找到好的方法
STR=STR[1:len(STR)]
STR=STR.translate(None,string.punctuation)
STR=STR.replace('“','')
STR=STR.replace('”','')
STR=STR.replace('《','')
STR=STR.replace('》','')
self.find(STR)#调用百度搜索,并保存到本地,再用默认浏览器打开
print STR
f.close()#关闭文件,不然后面删除不掉
shutil.rmtree(path)#删除之前获得的图片文件以及这个文件夹,以便下次判断是否已经截屏
#打开图片并裁剪
def cut(self):
im_name=os.listdir(path)#获取图片名,因为截屏靠的外部软件,没办法修改截屏图片的名字
im=Image.open(path+'\\'+im_name[0])
box1=(93,380,970,1200)#这个是把选项也截进来
box2=(93,380,970,630)#这个是不把选项截下来
crop_im=im.crop(box1)#裁剪函数
im.close()
crop_im.save('im.jpg')#保存本地,有不保存就直接用二进制打开的方式吗??求教
#调用百度搜索,并保存到本地,再用默认浏览器打开,参考百度的资料,具体哪篇忘记了,,如有问题请联系我。。
def find(self,STR):
url = "http://www.baidu.com/s"
search = [('w',STR)]
getString = url + "?" + urllib.urlencode(search)
req = urllib2.Request(getString)
fd = urllib2.urlopen(req)
baiduResponse=fd.read()
fobj=open("baidu.html",'w')
fobj.write(baiduResponse)
os.startfile('baidu.html')#这个函数就很刚好的解决了大问题,可以用浏览器打开网页,不然就得手点了
fobj.close()
if __name__ == '__main__':
HOTKEY=win32con.VK_F6 #结束程序的快捷键F6,自行根据需要修改,一定要手动关闭程序,否则下次这个快捷键就用不了了
path="E:\Python\cddh\Pictures"#存储图片的路径,Pictures是软件自动创建的,所以修改路径时最后都要添加这个
EXIT = False #用来传递退出的参数
ID=106 #注册热键的唯一id,用来区分热键
ans=Ans()#创建实例
hotkey = Hotkey()
hotkey.start()#启动线程
while(True):
if os.path.exists(path):#检测是否截屏了,截屏了就会生成Pictures文件夹
if os.listdir(path):#这里再做检测是因为文件夹创建完不代表图片就创建完成了,不信试试
time.sleep(0.1)#删掉测试一下就知道为什么要加了。。反正我这里测试是要加的
ans.main()
elif EXIT==True: #退出程序
break