turingAPI vs turingIO

turingAPI与turingIO的区别

前世今生

turingIO是冰梨在6月份还未开发完成的一个项目。或许他也不打算开发完成。但是turingAPI的作者对该项目抱有极大兴趣,便沿用turingIO的名字,继续开发起了turingIO.

turingIO的开发工作在2022.7开始。当时预计在8.15开发完毕并上线售卖,高级版售价2¥一份。

但是在后来9月,turingIO的作者觉得之前写的代码太烂,所以重写了turingIO,听从冰梨意见,改库名为turingAPI。

turingAPI vs turingIO

API数量:

#turingAPI :41个API
#turingIO : 基础版11个 + 高级版6个 = 17个API
#turingAPI 胜出

开源:

#turingAPI : 免费开源
#turingIO : 不免费,更不开源
#turingAPI 胜出

内核:

#turingAPI : urllib3 + asyncio
#turingIO : requests + urllib
#并非说requests不好,只是requests速度并没有urllib3快,且turingIO没有内置异步接口
#turingAPI 胜出

代码简洁度:

#  以下是turingAPI的comment方法(beta 0.1):
def comment(self,workId,data):
    return self.http.request('POST','https://icodeshequ.youdao.com/api/works/comment',body=('{"id":"'+str(workId)+'","content":"'+str(data)+'"}').encode('utf-8'),headers={'Accept': 'application/json, text/plain, */*',
    'Content-Type': 'application/json;charset=UTF-8',
    'Cookie': self.cookie,'User-Agent': self.userAgent})
    

#  以下是turingIO的comment方法(turingIO 基础版0.5):
def comment(self,urll,datas,isencode="is"):
        try:
            urll=str(urll)
            datas=str(datas)
            isencode=str(isencode)
            temp=0
            if not urll.find("?from=")==-1:
                urll=urll[0:urll.find('?from='):1][-32::]
            else:
                urll=urll[-32::]
            datas='{"id":"'+str(urll)+'","content":"'+str(datas)+'"}'
            if isencode=="is":
                temp=requests.post(url='https://icodeshequ.youdao.com/api/works/comment',data=datas.encode("utf-8"),headers={'Accept': 'application/json, text/plain, */*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
                'Connection': 'keep-alive',
                'Content-Length': '654',
                'Content-type': 'application/json',
                'Cookie': self.cookies,
                'Host': 'icodeshequ.youdao.com',
                'Origin': 'https://icodeshequ.youdao.com',
                'Referer': 'https://icodeshequ.youdao.com/work/'+ urll +'?from=home',   
                'sec-ch-ua': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103"',
                'sec-ch-ua-mobile': '?0',
                'sec-ch-ua-platform': '"Windows"',
                'Sec-Fetch-Dest': 'empty',
                'Sec-Fetch-Mode': 'cors',
                'Sec-Fetch-Site': 'same-origin',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.49})'})
            else:
                temp=requests.post(url='https://icodeshequ.youdao.com/api/works/comment',data=datas,headers={'Accept': 'application/json, text/plain, */*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
                'Connection': 'keep-alive',
                'Content-Length': '654',
                'Content-type': 'application/json',
                'Cookie': self.cookies,
                'Host': 'icodeshequ.youdao.com',
                'Origin': 'https://icodeshequ.youdao.com',
                'Referer': 'https://icodeshequ.youdao.com/work/'+ urll +'?from=home',   
                'sec-ch-ua': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103"',
                'sec-ch-ua-mobile': '?0',
                'sec-ch-ua-platform': '"Windows"',
                'Sec-Fetch-Dest': 'empty',
                'Sec-Fetch-Mode': 'cors',
                'Sec-Fetch-Site': 'same-origin',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.49})'})
        except UnicodeEncodeError:
            print("用户"+self.userid+'调用comment时Unicode字符转换错误:发送中文及更多字符必须将isencode参数调为is,否则无法转换至bytes。或者您的参数类型输入错误!')
        except:
            print("用户"+self.userid+"在使用comment方法时出现未知错误,请检查您的网络是否已连接,或者是您的ip已经被小图灵封禁")
        else:
            if not str(temp)=='<Response [200]>':
                print("用户"+self.userid+"访问异常:"+str(temp)[str(temp).find('[')+1:-2:1])
                print(temp.text)
        return temp
        
        
        
#turingAPI 胜出

API可控性

#   以下是turingAPI的report方法构造:
def report(self,workId,rpdata,reportType=1)
#   以下是turingIO的report方法构造:
def report(self,sop,url)

#turingAPI 胜出
#PS:turingIO的sop参数意为“scratch or python” 。
#但turingAPI可以自动识别该作品的类型,所以将其删除。

运行效率:

import turingIO , time
user=turingIO.turing_user()
user.login('your cookie','your e-mail')
s=time.time()
for i in range(100):
    user.like('https://icodeshequ.youdao.com/work/55432928f19d4f7d90423303a83c1a10')
print(time.time()-s)


import turingAPI , time
user=turingAPI.icodeUser('your cookie')
s=time.time()
for i in range(100):
    user.like('55432928f19d4f7d90423303a83c1a10')
print(time.time()-s)


#我也不想说什么了,urllib3最强好吧(虽然 并发没有aiohttp快)
# turingAPI胜出

使用难易:

#turingIO基础版:
import turingIO
user=turingIO.turing_user()   #没有__init__初始化,很不方便
user.login('your cookie','userId')  #登录需要写userId,没有获取info的API
user.comment('https://一个作品网址','test',0)   #多出来一个多余的isencode参数,turingAPI
#直接自动编码
#输出:
#userId用户调用comment时Unicode字符转换错误:发送中文及更多字符必须将isencode参数调为is,否则无法
#转换至bytes。或者您的参数类型输入错误!
#不人性化的报错信息,没法具体debug
#------------------------------------#
#turingIO高级版:
import _turingIO_
user=turing_baduser('your cookie','userId')    #还是要填userId......
comments=user.get_projecy_comment('projectId',[1,2,3])   #控制精度不够,没法控制页内查询数目
print(comments)   #并且速度超慢
#------------------------------------#
#turingAPI
import turingAPI
user=turingAPI.icodeUser('your cookie')    #用驼峰式命名法,舒服了。并且登录只需要cookie,
#userId会被自动识别。
print(user.isLogin())    #简洁明了 API比turingIO多
#will print:
#True


#turingAPI 胜出

同步和异步

#turingIO : 没法并发
#turingAPI :
import turingAPI , asyncio , time
a=turingAPI.icodeUser('OUTFOX_SEARCH_USER_ID_NCOO=669150644.180877; OUTFOX_SEARCH_USER_ID="-1563481906@10.110.96.154"; P_INFO=13826255030|1663407616|1|youdaodict|00&99|null&null&null#gud&440100#10#0|&0||13826255030; DICT_PERS=v2|cqq||DICT||web||7776000000||1665668764369||240e:47c:40:45e3:99b4:da80:5b8c:140b||qqB60D8500058F9FBEA41D76E17167C37A||UfOfkGPLqL0PLhfOMO4Um0zM0MeB0MJB0YG0LYWkLTu0z50MTFPLzf0puh4UEhfTz0OW6LkAhflE0guhLw40fpz0; DICT_SESS=v2|KONAMuYzwR64nHwBnfwFRz5hfUWhfJFReKh4Quk4lM0TFhfQyRMOMRqZhMU5h4gFRQ4O4lW64gyRPFhfkMkMz50JyhMw46Lgz0; JSESSIONID=abcCJw-PqD7y7cPD3fGsy; xiaotuling=icode:session:b77c3c73bc7ccc7ad177d3469e99174f; DICT_LOGIN=3||1669396973145')  #用户

start = time.time()

for i in range(50):
    response=a.getWorks(1,1,1,keyword='魔法少女小圆',isParse=True)[0]['id']
    a.comment(response,'test')

print('同步用时:',time.time()-start)


def data(value,self):      #关联处理函数
    return [[value[0]['id'],'test'],{}]

e1=turingAPI.event(name='帅逼')
turingAPI.addTask(e1,a.comment,association='帅2')        #建立数据关联
turingAPI.addTask(e1,a.getWorks,'帅2',[1,1,1],{'keyword':'魔法少女小圆','isParse':True},returnFunc=data)
ep1=turingAPI.eventPool()
ep1.events=[e1 for i in range(50)]
start = time.time()
asyncio.run(ep1.runEvents(['帅逼']))

print('异步用时:',time.time()-start)

'''
输出:
同步用时: 23.86828875541687
异步用时: 3.4289634227752686
'''

#turingAPI 胜出

最重要的还是:turingAPI是开源免费的,并长期维护!而turingIO早在2022.9.1就被下北泽工作室官方停止支持。

turingAPI胜过turingIO的任何地方!

所以,我们推荐您使用turingAPI ,而并非turingIO!

Last updated