有道ai写作,突破免费限制,无限制使用

预览效果

示例图

  • 文末提供源码包及apk下载地址

有道ai写作python版

import hashlib
import time
import json
import ssl
import base64
import uuidfrom urllib.parse import quote
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from sseclient import SSEClient# 生成唯一的用户id
yduuid=str(uuid.uuid4()).replace('-','')session = requests.session()
lastModified = requests.get('https://fanyi.youdao.com/index.html').headers['last-Modified']
_nlmf = int(time.mktime(time.strptime(lastModified, "%a, %d %b %Y %H:%M:%S GMT")))
session.headers = {'Referer': 'https://fanyi.youdao.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
}
session.get(f'https://rlogs.youdao.com/rlog.php?_npid=fanyiweb&_ncat=pageview&_ncoo=935962676.0432019&_nssn=NULL&_nver=1.2.0&_ntms={time.time()}&_nref=&_nurl=https%3A%2F%2Ffanyi.youdao.com%2Findex.html%23%2F&_nres=1920x1080&_nlmf={_nlmf}&_njve=0&_nchr=utf-8&_nfrg=%2F&/=NULL&screen=1920*1080')# 获取md5加密结果
def get_md5(s,is_hex=True):md5=hashlib.md5()md5.update(s.encode())if is_hex:return md5.hexdigest()return md5.digest()# AES-128-CBC解密
def decrypt(encrypted_data, key, iv):cipher = AES.new(key, AES.MODE_CBC, iv)decrypted_data = cipher.decrypt(base64.b64decode(encrypted_data))return decrypted_data.decode('utf-8')def get_token_and_key():params = {'product': 'webdict', 'appVersion': '1.0', 'client': 'web', 'mid': '1', 'vendor': 'web','screen': '1', 'model': '1', 'imei': '1','network': 'wired', 'keyfrom': 'webdict','keyid': 'ai-write','mysticTime': str(int(time.time()*1000)),'yduuid': yduuid,}# 参数排序sorted_params = sorted(params.items(), key=lambda x: x[0])sorted_params.append(("key","xuiC95RuooxC8Q51UJtdod1plLUhdAmt"))encoded_params = '&'.join([f"{key}={value}" for key, value in sorted_params])print("encoded_params:::::"+encoded_params)# 获取sign签名sign=get_md5(encoded_params)params.update({"sign":sign})params.update({"pointParam":"appVersion,client,imei,keyfrom,keyid,mid,model,mysticTime,network,product,screen,vendor,yduuid,key"})response = session.get('https://luna-ai.youdao.com/write/ai/web/ktf', params=params, verify=False)print(response.text)#============解密数据===============================e=response.text.replace("-","+").replace("_","/")key=get_md5("IIS0fzL@zGv1^zO2%NcZiTcM=98WYxdun$CJE1KUKFfEhz&zpEC0fdXfvGqy*N!r",is_hex=False)iv=get_md5("kG_oSxAXx#xjbiOKAkf9915Ko-XclOBP-GSgfo6E9ZB%9WvgcY6Y7dmje!+m5g#d",is_hex=False)s=decrypt(e,key,iv).replace('\x02', '')print("解密数据::::"+s)decode_data=json.loads(json.loads(s))return decode_datadef get_result(query):decode_data=get_token_and_key()params = {'product': 'webdict', 'appVersion': '1.0', 'client': 'web', 'mid': '1', 'vendor': 'web','screen': '1', 'model': '1', 'imei': '1','network': 'wired', 'keyfrom': 'webdict','keyid': 'ai-write-web','mysticTime': str(int(time.time()*1000)),'yduuid': yduuid,'functionId':'1','query':quote(query),'userCustomize':quote(query),'token':decode_data["token"]}# 参数排序sorted_params = sorted(params.items(), key=lambda x: x[0])sorted_params.append(("key",decode_data['sk']))encoded_params = '&'.join([f"{key}={value}" for key, value in sorted_params])print("encoded_params:::::"+encoded_params)# 获取签名字符串sign=get_md5(encoded_params)params.update({"sign":sign})print("签名字符串:"+sign)params.update({"pointParam":"appVersion,client,functionId,imei,keyfrom,keyid,mid,model,mysticTime,network,product,query,screen,token,userCustomize,vendor,yduuid,key"})# 数据为multipart/form-data格式multipart_data = MultipartEncoder(fields=params)# 修改请求头中的Content-Typesession.headers['Content-Type']= multipart_data.content_type# 发送请求response = session.post('https://luna-ai.youdao.com/write/ai/template/sse', data=multipart_data, stream=True,verify=False)# 处理SSE流数据client=SSEClient(response)for event in client.events():# 判断事件类型if event.event=='message':# 不换行输出print(json.loads(event.data)['content'],end='')if __name__=='__main__':keyword=input('请输入关键词:')get_result(keyword)

有道ai写作lua版

使用Aide lua打包为apk

  • 主要lua代码
require "import"
--import "androidx"
--import "androidx.appcompat.app.*"
--import "androidx.appcompat.view.*"
--import "androidx.appcompat.widget.*"
--import "android.app.*"
import "android.os.*"
import "android.widget.*"
import "android.view.*"
import "androidx.coordinatorlayout.widget.CoordinatorLayout"local layout={CoordinatorLayout;layout_height="fill";layout_width="match_parent";{LinearLayout;layout_width="match_parent";orientation="vertical";layout_height="match_parent";{LinearLayout;layout_width="match_parent";orientation="horizontal";layout_height="wrap_content";{EditText;layout_marginTop="10";id="inputText";hint="请输入关键词";layout_weight=19;layout_marginLeft="5";};{Button;layout_marginTop="10";id="translateBtn";text="ai写作";layout_weight=1;layout_marginRight="5";};};{LinearLayout;layout_width="fill";layout_height="fill";{ScrollView;layout_width="fill";id="1";layout_height="fill";{TextView;layout_margin="10";layout_width="fill";id="resultView";layout_height="wrap_content";};};};};
};--ui结束activity.setContentView(loadlayout(layout))-- 生成时间戳
function getTimestamp()local Date = luajava.bindClass "java.util.Date"return Date().getTime()
end-- 字符串url编码
function urlEncode(s)-- url编码local s = string.gsub(s, "([^%w%.%- ])", function(c) return string.format("%%%02X", string.byte(c)) end)-- 逗号不编码return s:gsub(" ", "+"):gsub("%%2C",","):gsub("%%25","%%")
end-- 字符串序列化
function tableToStr(tbl,sep)local str = ''local sep= sep or '&'for key, value in pairs(tbl) dostr = str .. key .. '=' .. urlEncode(value) .. sependreturn string.sub(str, 1, -2)
end-- 拼接排序后的表为字符串
function tableToStr1(tbl)local str = ''for key, value in ipairs(tbl) dostr = str .. value[1] .. '=' .. urlEncode(value[2]) .. '&'endreturn string.sub(str, 1, -2)
end-- md5加密
function md5Encrypt(data,isHex)local MessageDigest = luajava.bindClass "java.security.MessageDigest"local md = MessageDigest.getInstance("MD5")local bytes = md.digest(String(data).getBytes())local isHex= (isHex==nil) and true or falseif isHex ==false thenreturn bytesendlocal result = ""for i = 0, #bytes - 1 dolocal temp = string.format("%02x", (bytes[i] & 0xff))result = result .. tempendreturn result
end-- AES解密
function decrypt(encryptStr, key, iv)local String = luajava.bindClass "java.lang.String"local SecretKeySpec = luajava.bindClass "javax.crypto.spec.SecretKeySpec"local IvParameterSpec = luajava.bindClass "javax.crypto.spec.IvParameterSpec"local Cipher = luajava.bindClass "javax.crypto.Cipher"local Base64 = luajava.bindClass "android.util.Base64"local algorithm = "AES"local mode = "AES/CBC/PKCS5Padding"local raw=SecretKeySpec(key,algorithm)local ivBytes = IvParameterSpec(iv)local cipher = Cipher.getInstance(mode)cipher.init(Cipher.DECRYPT_MODE, raw, ivBytes)local encode_content = Base64.decode(encryptStr, Base64.DEFAULT)local byte_content = cipher.doFinal(encode_content)return String(byte_content, "utf-8")
end-- 公共请求参数定义
local base = {Cookies = {['OUTFOX_SEARCH_USER_ID_NCOO'] = '1536815481.8081024',['OUTFOX_SEARCH_USER_ID'] = '1773118125@192.168.0.1',},Headers = {['Accept'] = 'application/json, text/plain, */*',['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',['Origin'] = 'https://fanyi.youdao.com',['Referer'] = 'https://fanyi.youdao.com/',['Sec-Fetch-Dest'] = 'empty',['Sec-Fetch-Mode'] = 'cors',['Sec-Fetch-Site'] = 'same-site',['User-Agent'] ='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',['sec-ch-ua'] = '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',['sec-ch-ua-mobile'] = '?0',['sec-ch-ua-platform'] = '"Windows"',},Params = {['product'] = 'webdict',['appVersion'] = '1.0',['client'] = 'web',['mid'] = '1',['vendor'] = 'web',['screen'] = '1',['model'] = '1',['imei'] = '1',['network'] = 'wired',['keyfrom'] = 'webdict',['keyid'] = 'ai-write',['mysticTime'] = '',['yduuid'] = '',}
}-- 生成全局唯一用户id,同一id只有10次免费机会,每次生成不同id即可跳过免费限制
function genUUID()local UUID=luajava.bindClass 'java.util.UUID'return string.gsub(tostring(UUID.randomUUID()),'-','')
end--复制表
function copyTable(original)local copy = {}for key, value in pairs(original) doif type(value) == "table" thencopy[key] = copyTable(value) -- 递归复制子表elsecopy[key] = valueendendreturn copy
end-- 获得按键排序后的参数table
function getSortedParams(params)local function compare(a, b)return a[1] < b[1]endlocal sorted_params = {}for key, value in pairs(params) dotable.insert(sorted_params, { key, value })endtable.sort(sorted_params, compare)return sorted_params
end-- 获取token和key
function getTokenAndKey()local JSON=require 'cjson'local url = 'https://luna-ai.youdao.com/write/ai/web/ktf'-- 复制公共表头和参数local headers = copyTable(base.Headers)local params = copyTable(base.Params)local cookies = tableToStr(base.Cookies,";")-- 设置参数params['mysticTime']=getTimestamp()-- 生成yduuidbase.yduuid=genUUID()params['yduuid']=base.yduuid-- 按照table中键进行排序,并指定排序函数local sorted_params=getSortedParams(params)local encoded_params = tableToStr1(sorted_params)encoded_params = encoded_params .. "&key=xuiC95RuooxC8Q51UJtdod1plLUhdAmt"print("获取签名字符串"..encoded_params)local sign = md5Encrypt(encoded_params)print("获取签名的sign:"..sign)params['sign'] = signparams['pointParam'] ="appVersion,client,imei,keyfrom,keyid,mid,model,mysticTime,network,product,screen,vendor,yduuid,key"local finalUrl=url..'?'..tableToStr(params)print("请求地址"..finalUrl)-- 发送请求local httpTask=Http.get(finalUrl,cookies,nil,headers,function () end)local result=httpTask.get()local code,content,cookie,header=result[0],result[1],result[2],result[3]-- 解密数据local b64str=content:gsub(' ','+'):gsub('-','+'):gsub('_','/')-- des解密local key=md5Encrypt('IIS0fzL@zGv1^zO2%NcZiTcM=98WYxdun$CJE1KUKFfEhz&zpEC0fdXfvGqy*N!r',false)local iv=md5Encrypt('kG_oSxAXx#xjbiOKAkf9915Ko-XclOBP-GSgfo6E9ZB%9WvgcY6Y7dmje!+m5g#d',false)local s=tostring(decrypt(b64str,key,iv))s=string.gsub(s,'\x02','')print("token和sign"..s)local decodeData=JSON.decode(JSON.decode(s))return decodeData['sk'],decodeData['token']
end-- 获取翻译结果
function getResult(query)local JSON=require 'cjson'local url = 'https://luna-ai.youdao.com/write/ai/template/sse'-- 复制公共表头和参数local headers = copyTable(base.Headers)local params = copyTable(base.Params)-- 获取token和keylocal key,token=getTokenAndKey()-- 设置参数params['mysticTime']=getTimestamp()params['yduuid']=base.yduuidparams['keyid']='ai-write-web'params['functionId']='1'params['query']=urlEncode(query)params['userCustomize']=urlEncode(query)params['token']=token-- 设置头部local boundary="jeb3u3g5vh5v3hh2h2hg5g6v7vh4hehdjd"headers['Content-Type']='multipart/form-data;boundary='..boundaryheaders['Accept']='*/*, text/event-stream'headers["Referer"]="https://fanyi.youdao.com/aiwrite/document"-- 按照table中键进行排序,并指定排序函数local sorted_params=getSortedParams(params)local encoded_params=tableToStr1(sorted_params)encoded_params = encoded_params .. "&key="..keyprint('生成签名的参数字符串:::'..encoded_params)local sign = md5Encrypt(encoded_params)params['sign'] = signprint("签名结果:::"..sign)params['pointParam'] = 'appVersion,client,functionId,imei,keyfrom,keyid,mid,model,mysticTime,network,product,query,screen,token,userCustomize,vendor,yduuid,key'-- 处理sse事件流数据local OkHttpClient=luajava.bindClass 'okhttp3.OkHttpClient'local MultipartBody=luajava.bindClass 'okhttp3.MultipartBody'local Request=luajava.bindClass 'okhttp3.Request'local RealEventSource=luajava.bindClass 'okhttp3.internal.sse.RealEventSource'local EventSource=luajava.bindClass 'okhttp3.sse.EventSource'local EventSourceListener=luajava.bindClass 'okhttp3.sse.EventSourceListener'local TimeUnit=luajava.bindClass 'java.util.concurrent.TimeUnit'local client =OkHttpClient.Builder().connectTimeout(20,TimeUnit.SECONDS).readTimeout(20,TimeUnit.SECONDS).build()local requestBodyBuilder=MultipartBody.Builder().setType(MultipartBody.FORM)--添加请求参数for k,v in pairs(params) dorequestBodyBuilder.addFormDataPart(String(k),String(tostring(v)))endlocal requestBody=requestBodyBuilder.build()local requestBuilder = Request.Builder().url(url)-- 添加请求头for k,v in pairs(headers) dorequestBuilder.header(String(k),String(tostring(v)))endlocal request=requestBuilder.post(requestBody).build()-- 事件监听器local listener=EventSourceListener({onOpen=function(eventSource,response)print("建立sse链接")print(response)end,onEvent=function(eventSource,id,_type,data)-- 判断事件类型if _type=="message" then-- 更新uiactivity.runOnUiThread(Runnable{run=function()local result=JSON.decode(data)resultView.append(result["content"])end})endend,onFailure=function(eventSource,t,response)print("打开链接失败")end,onClose=function(eventSource)print("连接关闭")end})local eventSource=RealEventSource(request,listener)--开启事件源连接eventSource.connect(client)
end-- 测试
translateBtn.onClick=function()-- 清空上一次的结果resultView.setText("")local inputStr=tostring(inputText.getText())getResult(inputStr)
end

apk源码包及apk下载地址

  • 源码:https://www.123pan.com/s/J5Nsjv-6XBN.html 提取码:SnKW
  • apk:https://www.123pan.com/s/J5Nsjv-6XBN.html 提取码:SnKW

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2775497.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Redis核心技术与实战【学习笔记】 - 27.限制Redis Cluster规模的因素(通信开销)

简述 Redis Cluster 能保存的数据量以及支撑的吞吐量&#xff0c;跟集群实例规模相关。 Redis 官方给出了 Redis Cluster 的规模上线&#xff0c;就是一个集群运行 1000 个实例。 其实&#xff0c;限定 Redis Cluster 集群规模的一个关键因素就是&#xff0c;实例间的通信开销…

TCP 传输控制协议

1 TCP 1.1 TCP 最主要的特点 1.TCP 是面向连接的运输层协议。 2.每一条 TCP 连接只能有两个端点 (endpoint)&#xff0c;每一条 TCP 连接只能是点对点的&#xff08;一对一&#xff09;。 3.TCP 提供可靠交付的服务。 4.TCP 提供全双工通信。 5.面向字节流 TCP 中的“流…

力扣刷题之旅:进阶篇(二)

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 继续我的力扣刷题之旅&#xff0c;在上一篇文章中&#xff0c;我深入探索了图算法和动态…

Unity3d Shader篇(六)— BlinnPhong高光反射着色器

文章目录 前言一、BlinnPhong高光反射着色器是什么&#xff1f;1. BlinnPhong高光反射着色器的工作原理2. BlinnPhong高光反射着色器的优缺点优点缺点 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(一)

一、序言 gnome-builder构建器是gnome程序开发的集成环境&#xff0c;支持主力语言C, C, Vala, jscript, python等&#xff0c;界面以最新的 gtk 4.12 为主力&#xff0c;将其下版本的gtk直接压入了depreciated&#xff0c;但gtk4.12与普遍使用的gtk3有很大区别&#xff0c;原…

【BUUCTF N1BOOK】[第九章 CTF之MISC章] 通关

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

VMwawre配置静态ip

1、查看当前虚拟机网关&#xff08;记住这个网关&#xff0c;后面使用&#xff09; 2、进入目录命令&#xff1a;cd /etc/sysconfig/network-scripts/ 3、编辑网卡配置文件命令&#xff1a;vim ifcfg-ens33 4、配置静态IP&#xff0c;修改和增加如下信息&#xff1a; 修改的内…

vue3 之 商城项目—一级分类

整体认识和路由配置 场景&#xff1a;点击哪个分类跳转到对应的路由页面&#xff0c;路由传对应的参数 router/index.js import { createRouter, createWebHashHistory } from vue-router import Layout from /views/Layout/index.vue import Home from /views/Home/index.vu…

【网工】华为设备命令学习(Telnet)

本次实验AR3为我们实际中远程的路由&#xff0c;AR4模拟我们的设备&#xff0c;最终实现Telnet的远程控制路由&#xff01; 本次笔记主要记录Telnet技术实现原理&#xff0c;后续再补充具体配置代码。 Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的…

哈希表—闭散列

目录 背景 实现 设置状态 存储 获取key函数 构造函数 插入 查找 删除 打印 完整代码 背景 常用哈希函数 除留取余法 设散列表中允许的地址数为m&#xff0c;取一个不大于m&#xff0c;但最接近或者等于m的质数p作为除数&#xff0c;按照哈希 函数&#xff1a;H a…

ubuntu22.04安装部署03: 设置root密码

一、前言 ubuntu22.04 安装完成以后&#xff0c;默认root用户是没有设置密码的&#xff0c;需要手动设置。具体的设置过程如下文内容所示&#xff1a; 相关文件&#xff1a; 《ubuntu22.04装部署01&#xff1a;禁用内核更新》 《ubuntu22.04装部署02&#xff1a;禁用显卡更…

山西电力市场日前价格预测【2024-02-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-08&#xff09;山西电力市场全天平均日前电价为200.58元/MWh。其中&#xff0c;最高日前电价为347.58元/MWh&#xff0c;预计出现在07:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

数据结构 - 线索树

一、 为什么要用到线索二叉树&#xff1f; 我们先来看看普通的二叉树有什么缺点。下面是一个普通二叉树&#xff08;链式存储方式&#xff09;&#xff1a; 乍一看&#xff0c;会不会有一种违和感&#xff1f;整个结构一共有 7 个结点&#xff0c;总共 14 个指针域&#xff0c…

【多模态】27、Vary | 通过扩充图像词汇来提升多模态模型在细粒度感知任务(OCR等)上的效果

文章目录 一、背景二、方法2.1 生成 new vision vocabulary2.1.1 new vocabulary network2.1.2 Data engine in the generating phrase2.1.3 输入的格式 2.2 扩大 vision vocabulary2.2.1 Vary-base 的结构2.2.2 Data engine2.2.3 对话格式 三、效果3.1 数据集3.2 图像细粒度感…

云安全的基本概念(基本目标与指导方针)

目录 一、云安全概念概述 1.1 概述 二、云安全的基本目标 2.1 安全策略开发模型 2.1.1 信息安全三元组 2.1.1.1 保密性(Confidentiality) 2.1.1.2 完整性(Integrity) 2.1.1.3 可用性(Availability) 2.1.2 信息安全三元组的局限性 2.2 其他信息安全属性 2.2.1 真实性 …

双指针和单调栈

双指针 用于解决一类基于子段的统计问题 子段就是&#xff1a;数组中连续的一段 可以用一个闭区间来表示数组中的连续一段 这个方法核心就是优化&#xff1a;两种循环的枚举 也就是枚举左端点l和右端点r的所有可能优化关键就是&#xff1a;去除枚举中的冗余部分 具体优化策略…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Span组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Span组件 鸿蒙&#xff08;HarmonyOS&#xff09;作为Text组件的子组件&#xff0…

C# 委托(delegate)本质理解

目录 代码如下&#xff0c;很简单 运行的结果 反编译程序查看 关注两点&#xff1a; 什么是委托 委托的三个步骤 委托的意义 代码如下&#xff0c;很简单 namespace Delegate { class Program { delegate void SayHi(); void SayHi_1() …

[Java][算法 双指针]Day 02---LeetCode 热题 100---04~07

LeetCode 热题 100---04~07 第一题&#xff1a;移动零 思路 找到每一个为0的元素 然后移到数组的最后 但是需要注意的是 要在给定的数组原地进行修改 并且其他非零元素的相对顺序不能改变 我们采用双指针法 定义两个指针i和j i和j一开始分别都在0索引位置 然后判断j所…

爪哇部落算法组2024新生赛热身赛题解

第一题&#xff08;签到&#xff09;&#xff1a; 1、题意&#xff1a; 2、题解: 我们观察到happynewyear的长度是12个字符&#xff0c;我们直接从前往后遍历0到n - 12的位置&#xff08;这里索引从0开始&#xff09;&#xff0c;使用C的substr()函数找到以i开头的长度为12的字…