├── lib ├── confirmation_code │ ├── version.rb │ └── service │ │ ├── lianzhong.rb │ │ └── damatu.rb └── confirmation_code.rb ├── bin └── confirmation_code ├── confirmation_code.gemspec ├── run.rb ├── .gitignore ├── readme.md ├── api.py └── damatu.paw /lib/confirmation_code/version.rb: -------------------------------------------------------------------------------- 1 | module ConfirmationCode 2 | VERSION = "0.0.7" 3 | end 4 | -------------------------------------------------------------------------------- /bin/confirmation_code: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require 'confirmation_code' 4 | 5 | ConfirmationCode.start ARGV 6 | -------------------------------------------------------------------------------- /confirmation_code.gemspec: -------------------------------------------------------------------------------- 1 | lib = File.expand_path('../lib', __FILE__) 2 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 3 | require 'confirmation_code/version' 4 | 5 | Gem::Specification.new do |s| 6 | s.name = "confirmation_code" 7 | s.version = ConfirmationCode::VERSION 8 | s.date = "2016-02-03" 9 | s.summary = "use platforms like lianzhong to auto input confirmation code" 10 | s.description = "support platforms like lianzhong" 11 | s.authors = ["seaify"] 12 | s.email = "dilin.life@gmail.com" 13 | s.files += `git ls-files`.split($/) 14 | s.homepage = "https://github.com/seaify/confirmation_code" 15 | s.license = "MIT" 16 | 17 | s.executables << 'confirmation_code' 18 | s.add_dependency 'httpclient', '~> 2.7' 19 | s.add_dependency 'awesome_print', '~> 1.6' 20 | end 21 | -------------------------------------------------------------------------------- /run.rb: -------------------------------------------------------------------------------- 1 | lib = File.expand_path('../lib', __FILE__) 2 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 3 | 4 | require 'confirmation_code' 5 | 6 | #result = ConfirmationCode.upload 'https://passport.58.com/validatecode?temp=123i1knr04o' 7 | ConfirmationCode.use :lianzhong, 'seaify', '67c86225' 8 | ap ConfirmationCode.account 9 | result = ConfirmationCode.upload('0349.bmp') 10 | ap ConfirmationCode.upload('http://captcha.qq.com/getimage') 11 | ap result 12 | ap ConfirmationCode.recognition_error result['data']['id'] 13 | 14 | ConfirmationCode.use :damatu, 'seaify', 'lsm123', {app_key: '0f80784a5ff20d38df3977e461e3d82a', app_id: '41635'} 15 | #ap ConfirmationCode.account 16 | result = ConfirmationCode.upload('http://captcha.qq.com/getimage') 17 | #result = ConfirmationCode.upload('0349.bmp') 18 | ap result 19 | ap ConfirmationCode.recognition_error result['data']['id'] 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Ruby template 2 | *.gem 3 | .idea/ 4 | *.rbc 5 | /.config 6 | /coverage/ 7 | /InstalledFiles 8 | /pkg/ 9 | /spec/reports/ 10 | /spec/examples.txt 11 | /test/tmp/ 12 | /test/version_tmp/ 13 | /tmp/ 14 | 15 | ## Specific to RubyMotion: 16 | .dat* 17 | .repl_history 18 | build/ 19 | 20 | ## Documentation cache and generated files: 21 | /.yardoc/ 22 | /_yardoc/ 23 | /doc/ 24 | /rdoc/ 25 | 26 | ## Environment normalisation: 27 | /.bundle/ 28 | /vendor/bundle 29 | /lib/bundler/man/ 30 | 31 | # for a library or gem, you might want to ignore these files since the code is 32 | # intended to run in multiple environments; otherwise, check them in: 33 | # Gemfile.lock 34 | # .ruby-version 35 | # .ruby-gemset 36 | 37 | # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: 38 | .rvmrc 39 | *.jpeg 40 | *.py 41 | *.doc 42 | *.bmp 43 | uuPythonDemo2014.6.7/ 44 | .DS_Store 45 | 46 | # Created by .ignore support plugin (hsz.mobi) 47 | -------------------------------------------------------------------------------- /lib/confirmation_code.rb: -------------------------------------------------------------------------------- 1 | Dir.glob("#{File.expand_path(File.dirname(__FILE__))}/confirmation_code/service/*.rb").sort.each do |f| 2 | require f.match(/(confirmation_code\/service\/.*)\.rb$/)[0] 3 | end 4 | 5 | require 'httpclient' 6 | 7 | module ConfirmationCode 8 | extend self 9 | 10 | attr_reader :username, :password 11 | 12 | def use(service, username, password, options = {}) 13 | @service = ConfirmationCode::Service.const_get("#{service.to_s.capitalize}") 14 | @service.set_extra_options(options) 15 | @username = username 16 | @password = password 17 | @service 18 | end 19 | 20 | def upload(image_path, options = {}) 21 | options = default_options.merge options 22 | if image_path.start_with?('http') 23 | @service.upload image_path, options if @service 24 | else 25 | @service.upload_local image_path, options if @service 26 | end 27 | end 28 | 29 | def account 30 | @service.account default_options if @service 31 | end 32 | 33 | def recognition_error(yzm_id) 34 | @service.recognition_error yzm_id, default_options if @service 35 | end 36 | 37 | private 38 | 39 | def default_options 40 | { 41 | user_name: @username, 42 | user_pw: @password, 43 | } 44 | end 45 | 46 | end -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # ConfirmationCode 验证码平台 Ruby 接口 2 | 3 | ## 支持以下打码平台 4 | 5 | * [联众](https://www.jsdati.com/) 6 | * [打码兔](http://www.dama2.com/) 7 | 8 | 还尝试过云打码, uusee, 挣码等,但都有一些问题,所以没有接入. 9 | 10 | 云打码: 使用样例,验证码类型设置为了1-6位,识别出来少了1位. 11 | uusee: api样例代码太复杂 12 | 挣码: 给的http接口样例,域名都失效了 13 | 14 | 尝试过的所有验证码平台, 官方网站+api都给人很不专业的感觉, 比云片网差太多了, 所以建议不要充值太多, 觉得也许容易跑路. 15 | 16 | ## 安装 17 | 18 | 加入以下代码到 Gemfile: 19 | 20 | gem 'confirmation_code' 21 | 22 | 然后执行: 23 | 24 | $ bundle 25 | 26 | 或者直接安装: 27 | 28 | $ gem install confirmation_code 29 | 30 | ## 使用 31 | 32 | 代码风格上参照了china_sms 33 | ```ruby 34 | # 支持 :lianzhong, :damatu 验证码接口 35 | ConfirmationCode.use :lianzhong, 'seaify', '67c86225' 36 | result = ConfirmationCode.upload('http://captcha.qq.com/getimage') 37 | 38 | # 第一个参数验证码平台类型, 目前支持:lianzhong, :damatu, 第二个参数是用户名, 第三个参数是密码 39 | ConfirmationCode.use :lianzhong, 'seaify', '67c86225' 40 | 41 | # 上传图片url到打码平台 42 | result = ConfirmationCode.upload('http://captcha.qq.com/getimage') 43 | 44 | # 上传本地图片到打码平台 45 | result = ConfirmationCode.upload('0349.bmp') 46 | 47 | # 报告验证码识别结果有误 48 | ap ConfirmationCode.recognition_error result['data']['id'] 49 | ``` 50 | 51 | ## 注意 52 | 示例中的用户名,密码是我的账号, 只充值了1块. 53 | 54 | 另外打码平台, 有软件分成的概念, 目前damatu默认使用的软件是我的一个软件, 后面更新时, 会提供接口, 供指定软件. 55 | -------------------------------------------------------------------------------- /lib/confirmation_code/service/lianzhong.rb: -------------------------------------------------------------------------------- 1 | require 'awesome_print' 2 | require 'open-uri' 3 | require 'httpclient' 4 | require 'json' 5 | 6 | module ConfirmationCode 7 | module Service 8 | module Lianzhong 9 | 10 | extend self 11 | include ConfirmationCode 12 | 13 | UPLOAD_URL = 'http://bbb4.hyslt.com/api.php?mod=php&act=upload' 14 | ACCOUNT_URL = 'http://bbb4.hyslt.com/api.php?mod=php&act=point' 15 | RECOGNITION_ERROR_URL = 'http://bbb4.hyslt.com/api.php?mod=php&act=error' 16 | 17 | def client 18 | @client ||= HTTPClient.new 19 | end 20 | 21 | def set_extra_options(options) 22 | 23 | end 24 | 25 | def upload(image_url, options = {}) 26 | File.open("code.jpeg", "wb") do |f| 27 | f.write open(image_url).read 28 | end 29 | options = lianzhong_options.merge options 30 | File.open('code.jpeg') do |file| 31 | options['upload'] = file 32 | response = client.post(UPLOAD_URL, options) 33 | result(JSON.parse(response.body)) 34 | end 35 | end 36 | 37 | def upload_local(image_path, options = {}) 38 | options = lianzhong_options.merge options 39 | File.open(image_path) do |file| 40 | options['upload'] = file 41 | response = client.post(UPLOAD_URL, options) 42 | result(JSON.parse(response.body)) 43 | end 44 | end 45 | 46 | def account(options = {}) 47 | options = lianzhong_options.merge options 48 | print options 49 | response = client.post(ACCOUNT_URL, options) 50 | result(JSON.parse(response.body)) 51 | end 52 | 53 | def recognition_error(ret_id, options = {}) 54 | options['yzm_id'] = ret_id 55 | response = client.post(RECOGNITION_ERROR_URL, options) 56 | result(JSON.parse(response.body)) 57 | end 58 | 59 | def lianzhong_options 60 | { 61 | yzm_minlen: '4', 62 | yzm_maxlen: '6', 63 | yzmtype_mark: '', 64 | zztool_token: '', 65 | } 66 | end 67 | 68 | def result(body) 69 | { 70 | "success" => body['result'], 71 | "data" => body['data'] 72 | } 73 | end 74 | end 75 | 76 | end 77 | end -------------------------------------------------------------------------------- /lib/confirmation_code/service/damatu.rb: -------------------------------------------------------------------------------- 1 | require 'awesome_print' 2 | require 'open-uri' 3 | require 'httpclient' 4 | require 'json' 5 | require 'digest/md5' 6 | require 'active_support/core_ext/hash' 7 | 8 | module ConfirmationCode 9 | module Service 10 | module Damatu 11 | 12 | extend self 13 | include ConfirmationCode 14 | 15 | HOST = 'http://api.dama2.com:7766' 16 | 17 | UPLOAD_URL = File.join(HOST, 'app/d2Url?') 18 | UPLOAD_LOCAL_URL = File.join(HOST, 'app/d2File?') 19 | ACCOUNT_URL = File.join(HOST, 'app/d2Balance?') 20 | RECOGNITION_ERROR_URL = File.join(HOST, 'app/d2ReportError?') 21 | 22 | attr_reader :app_key, :app_id 23 | @app_id = '41635' 24 | @app_key = '0f80784a5ff20d38df3977e461e3d82a' 25 | 26 | 27 | def set_extra_options(options) 28 | @app_key = options[:app_key] 29 | @app_id = options[:app_id] 30 | end 31 | 32 | def set_app_key(app_key) 33 | @app_key = app_key 34 | end 35 | 36 | def client 37 | @client ||= HTTPClient.new 38 | end 39 | 40 | def md5(value) 41 | return Digest::MD5.hexdigest(value) 42 | end 43 | 44 | def get_pwd(user, pwd) 45 | return md5(@app_key + md5(md5(user) + md5(pwd))) 46 | end 47 | 48 | def sign(user, param = []) 49 | encode_str = (@app_key.bytes + user.bytes + param).pack('c*') 50 | return md5(encode_str)[0..7] 51 | end 52 | 53 | def upload(image_url, options = {}) 54 | upload_options = damatu_options(options) 55 | upload_options['url'] = CGI::escape(image_url) 56 | upload_options['sign'] = sign(upload_options['user'], image_url.bytes) 57 | upload_options['type'] = 200 if upload_options['type'].nil? 58 | response = client.get(UPLOAD_URL, upload_options) 59 | result(JSON.parse(response.body)) 60 | end 61 | 62 | def upload_local(image_path, options = {}) 63 | upload_options = damatu_options(options) 64 | upload_options['type'] = 200 if upload_options['type'].nil? 65 | byte_data = File.read(image_path) 66 | File.open(image_path) do |file| 67 | upload_options['file'] = file 68 | upload_options['sign'] = sign(upload_options['user'], byte_data.bytes) 69 | response = client.post(UPLOAD_LOCAL_URL, upload_options) 70 | result(JSON.parse(response.body)) 71 | end 72 | end 73 | 74 | def account(options = {}) 75 | account_options = damatu_options(options) 76 | account_options['sign'] = sign(account_options['user']) 77 | response = client.get(ACCOUNT_URL, account_options) 78 | result(JSON.parse(response.body)) 79 | end 80 | 81 | def recognition_error(ret_id, options = {}) 82 | recognition_options = damatu_options(options) 83 | recognition_options['id'] = ret_id.to_s 84 | recognition_options['sign'] = sign(recognition_options['user'], ret_id.to_s.bytes) 85 | response = client.post(RECOGNITION_ERROR_URL, recognition_options) 86 | result(JSON.parse(response.body)) 87 | end 88 | 89 | def damatu_options(options) 90 | damatu_options = {} 91 | damatu_options['appID'] = @app_id 92 | damatu_options['user'] = options[:user_name] 93 | damatu_options['pwd'] = get_pwd(options[:user_name], options[:user_pw]) 94 | damatu_options['type'] = options[:type] unless options[:type].nil? 95 | return damatu_options 96 | end 97 | 98 | def result(body) 99 | { 100 | "success" => body['ret'] == 0, 101 | "data" => body.except('ret', 'sign', 'cookie') 102 | } 103 | end 104 | end 105 | 106 | end 107 | end -------------------------------------------------------------------------------- /api.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #coding=utf-8 3 | 4 | import urllib 5 | import urllib2 6 | import mimetools, mimetypes 7 | import os, stat 8 | 9 | class Callable: 10 | def __init__(self, anycallable): 11 | self.__call__ = anycallable 12 | 13 | doseq = 1 14 | 15 | class MultipartPostHandler(urllib2.BaseHandler): 16 | handler_order = urllib2.HTTPHandler.handler_order - 10 # needs to run first 17 | 18 | def http_request(self, request): 19 | data = request.get_data() 20 | if data is not None and type(data) != str: 21 | v_files = [] 22 | v_vars = [] 23 | try: 24 | for(key, value) in data.items(): 25 | if type(value) == file: 26 | v_files.append((key, value)) 27 | else: 28 | v_vars.append((key, value)) 29 | except TypeError: 30 | systype, value, traceback = sys.exc_info() 31 | raise TypeError, "not a valid non-string sequence or mapping object", traceback 32 | 33 | if len(v_files) == 0: 34 | data = urllib.urlencode(v_vars, doseq) 35 | else: 36 | boundary, data = self.multipart_encode(v_vars, v_files) 37 | contenttype = 'multipart/form-data; boundary=%s' % boundary 38 | if(request.has_header('Content-Type') 39 | and request.get_header('Content-Type').find('multipart/form-data') != 0): 40 | print "Replacing %s with %s" % (request.get_header('content-type'), 'multipart/form-data') 41 | request.add_unredirected_header('Content-Type', contenttype) 42 | 43 | request.add_data(data) 44 | return request 45 | 46 | def multipart_encode(vars, files, boundary = None, buffer = None): 47 | if boundary is None: 48 | boundary = "--1234567890" 49 | if buffer is None: 50 | buffer = '' 51 | for(key, value) in vars: 52 | buffer += '--%s\r\n' % boundary 53 | buffer += 'Content-Disposition: form-data; name="%s"' % key 54 | buffer += '\r\n\r\n' + value + '\r\n' 55 | for(key, fd) in files: 56 | file_size = os.fstat(fd.fileno())[stat.ST_SIZE] 57 | filename = fd.name.split('/')[-1] 58 | contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' 59 | buffer += '--%s\r\n' % boundary 60 | buffer += 'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename) 61 | buffer += 'Content-Type: %s\r\n' % contenttype 62 | fd.seek(0) 63 | buffer += '\r\n' + fd.read() + '\r\n' 64 | buffer += '--%s--\r\n\r\n' % boundary 65 | return boundary, buffer 66 | multipart_encode = Callable(multipart_encode) 67 | https_request = http_request 68 | 69 | def main(api_username,api_password,img_url,api_post_url,yzm_min='',yzm_max='',yzm_type='',tools_token=''): 70 | import tempfile 71 | 72 | validatorURL = api_post_url 73 | opener = urllib2.build_opener(MultipartPostHandler) 74 | 75 | if yzm_min == '' : 76 | yzm_min = '4' 77 | if yzm_max == '' : 78 | yzm_max = '4' 79 | 80 | def validateFile(url): 81 | temp = tempfile.mkstemp(suffix=".png") 82 | os.write(temp[0],opener.open(url).read()) 83 | params = { "user_name" : '%s' % api_username, 84 | "user_pw" : "%s" % api_password , 85 | "yzm_minlen" : "%s" % yzm_min , 86 | "yzm_maxlen" : "%s" % yzm_max , 87 | "yzmtype_mark" : "%s" % yzm_type , 88 | "zztool_token" : "%s" % tools_token , 89 | "upload" : open(temp[1], "rb") 90 | } 91 | print params 92 | print opener.open(validatorURL, params).read() 93 | 94 | validateFile(img_url) 95 | 96 | if __name__=="__main__": 97 | main('seaify', 98 | '67c86225', 99 | 'https://passport.58.com/validatecode?temp=123i1knr04o', 100 | "http://bbb4.hyslt.com/api.php?mod=php&act=upload", 101 | '4', 102 | '6', 103 | '', 104 | '') 105 | 106 | ''' 107 | main() 参数介绍 108 | api_username (API账号) --必须提供 109 | api_password (API账号密码) --必须提供 110 | img_url (需要打码的验证码URL) --必须提供 111 | api_post_url (API接口地址) --必须提供 112 | yzm_min (验证码最小值) --可空提供 113 | yzm_max (验证码最大值) --可空提供 114 | yzm_type (验证码类型) --可空提供 115 | tools_token (工具或软件token) --可空提供 116 | ''' 117 | -------------------------------------------------------------------------------- /damatu.paw: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 134481920 7 | 0F034DAC-7079-4606-B391-4EAA2D184C72 8 | 204 9 | 10 | 11 | 12 | NSPersistenceFrameworkVersion 13 | 641 14 | NSStoreModelVersionHashes 15 | 16 | LMCookieJar 17 | 18 | Fttmf2L4PrGvKUF496+nqgVVGek45TjOe7sUMtjNg8I= 19 | 20 | LMEnvironment 21 | 22 | uzBoVFcO4YvR9/3ej4AJ1UOOsA/u5DKY2aemusoIseU= 23 | 24 | LMEnvironmentDomain 25 | 26 | yM1GPGHdquS8IWLtuczlNoqKhIhD9FW6IReSfFffJgs= 27 | 28 | LMEnvironmentVariable 29 | 30 | P8e0lYd5JZKRabS/eXVSOJ4oitilz67xtv+pLqW1Jqg= 31 | 32 | LMEnvironmentVariableValue 33 | 34 | my5hNPJ51oDCSa8EgdNxWAnRcDLcERUGjtuXnzhSxQ0= 35 | 36 | LMKeyValue 37 | 38 | bIXXbyYF2xAv2MXg8JTVFsslmMKuvsfnR86QdUcFkdM= 39 | 40 | LMRequest 41 | 42 | vcehD1+Y0zJEqCmgqlTWLscXXTAat5YQbsUJSVqwTq0= 43 | 44 | LMRequestGroup 45 | 46 | MnZKiG/nHZ2bvbULv2vfzH+0tXd5w+NuuMPlNJjBAMw= 47 | 48 | LMRequestTreeItem 49 | 50 | Ae5GlAcsXxZOGKCPQgemYbXQ3+KUtHlsprrqBD+V81o= 51 | 52 | 53 | NSStoreModelVersionHashesVersion 54 | 3 55 | NSStoreModelVersionIdentifiers 56 | 57 | LMDocumentVersion4 58 | 59 | 60 | 61 | 62 | 63 | 64 | CB95B396-6876-494E-A6CD-5676BE7F0DD1 65 | 1 66 | Default Jar 67 | 68 | 69 | 70 | 0 71 | 72 | 1 73 | 74 | 75 | 76 | 77 | 78 | 79 | [{"data":{"json":"{\\"user\\":\\"[{\\\\\\"data\\\\\\":{\\\\\\"environmentVariable\\\\\\":\\\\\\"295648E5-FC22-4DA5-BDBF-F1CC230CB8A0\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.luckymarmot.EnvironmentVariableDynamicValue\\\\\\"}]\\",\\"pwd\\":\\"[{\\\\\\"data\\\\\\":{\\\\\\"environmentVariable\\\\\\":\\\\\\"CC6DE0A1-EC21-4D3F-AA1B-4C06006E4B45\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.luckymarmot.EnvironmentVariableDynamicValue\\\\\\"}]\\",\\"appID\\":\\"[{\\\\\\"data\\\\\\":{\\\\\\"environmentVariable\\\\\\":\\\\\\"CE62BA1B-77E4-4ED0-B603-EFC8D7C20CB3\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.luckymarmot.EnvironmentVariableDynamicValue\\\\\\"}]\\",\\"sign\\":\\"b3606170\\"}"},"identifier":"com.luckymarmot.JSONDynamicValue"}] 80 | 85452E27-2D8D-4851-BCBB-27B7E096910C 81 | [{"data":{"environmentVariable":"FBBFC2D5-CB61-419A-8CB5-EB3ED5A91547"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\\/app\\/d2Balance?appID=",{"data":{"environmentVariable":"CE62BA1B-77E4-4ED0-B603-EFC8D7C20CB3"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600pwd=",{"data":{"environmentVariable":"CC6DE0A1-EC21-4D3F-AA1B-4C06006E4B45"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600user=",{"data":{"environmentVariable":"295648E5-FC22-4DA5-BDBF-F1CC230CB8A0"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600sign=",{"data":{"environmentVariable":"BBC5024E-958D-4DEF-A9EA-90F64D090A8D"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"}] 82 | 1 83 | 1 84 | 0 85 | 0 86 | GET 87 | 0 88 | 0 89 | 查询余额 90 | 91 | 92 | 93 | 94 | 95 | 690E4168-7AA7-4EA5-975C-009572E87965 96 | 0 97 | 打码兔 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | D920AAAA-8410-442D-853A-14A0B421DFE1 106 | [{"data":{"environmentVariable":"3F0E126E-80EB-42FC-948F-9BB3056D1789"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},{"data":{"environmentVariable":"FBBFC2D5-CB61-419A-8CB5-EB3ED5A91547"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\\/app\\/d2Url?appID=",{"data":{"environmentVariable":"CE62BA1B-77E4-4ED0-B603-EFC8D7C20CB3"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600pwd=",{"data":{"environmentVariable":"CC6DE0A1-EC21-4D3F-AA1B-4C06006E4B45"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600user=",{"data":{"environmentVariable":"295648E5-FC22-4DA5-BDBF-F1CC230CB8A0"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600sign=",{"data":{"environmentVariable":"3777C087-9325-40C3-AD9A-44291FAC0958"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600url=",{"data":{"environmentVariable":"D44B9442-5950-420A-8EB5-011C75F740D5"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600type=200"] 107 | 1 108 | 1 109 | 0 110 | 0 111 | POST 112 | 0 113 | [{"data":{"keyValues":[]},"identifier":"com.luckymarmot.BodyMultipartFormDataDynamicValue"}] 114 | 1 115 | 上传图片url 116 | 117 | 118 | 119 | 120 | 121 | 122 | 0 123 | 124 | 1 125 | 126 | 127 | 128 | 129 | 130 | 131 | ACB78D83-97A5-4C0E-9ACF-5DFF85A36491 132 | 0 133 | 打码兔 134 | 135 | 136 | 137 | 138 | 4DA5043C-87C9-47F9-A410-9AB64EFDDA6E 139 | 0 140 | Default Environment 141 | 142 | 143 | 144 | 145 | FBBFC2D5-CB61-419A-8CB5-EB3ED5A91547 146 | 0 147 | host 148 | 149 | 150 | 151 | 152 | http://api.dama2.com:7766 153 | 154 | 155 | 156 | 157 | 14CD7C53-4EEA-4A91-997D-94C8AC30867B 158 | 0 159 | md5_password 160 | 161 | 162 | 163 | 164 | 295648E5-FC22-4DA5-BDBF-F1CC230CB8A0 165 | 1 166 | user 167 | 168 | 169 | 170 | 171 | 760CC47F-5C07-409F-B265-91740991C3A2 172 | 1 173 | 打码兔加密 174 | 175 | 176 | 177 | 178 | lsm123 179 | 180 | 181 | 182 | 183 | A9F3BF08-0D68-41FF-9EEE-B30C5B42C2BB 184 | 2 185 | password 186 | 187 | 188 | 189 | 190 | [{"data":{"encoding":"Hexadecimal","hashType":2,"input":[{"data":{"environmentVariable":"295648E5-FC22-4DA5-BDBF-F1CC230CB8A0"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"}],"uppercase":0},"identifier":"com.luckymarmot.HashDynamicValue"}] 191 | 192 | 193 | 194 | 195 | 70D58A8C-0AC5-4ED2-B141-DB478F44348A 196 | 3 197 | app_key 198 | 199 | 200 | 201 | 202 | [{"data":{"encoding":"Hexadecimal","hashType":2,"input":[{"data":{"environmentVariable":"A9F3BF08-0D68-41FF-9EEE-B30C5B42C2BB"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"}],"uppercase":0},"identifier":"com.luckymarmot.HashDynamicValue"}] 203 | 204 | 205 | 206 | 207 | 0f80784a5ff20d38df3977e461e3d82a 208 | 209 | 210 | 211 | 212 | 608F3431-FB19-48FC-AE15-996C7D44C3AB 213 | 1 214 | md5_user 215 | 216 | 217 | 218 | 219 | seaify 220 | 221 | 222 | 223 | 224 | B64D464F-9D2D-4014-8599-475C5D78DA4C 225 | 0 226 | Default Environment 227 | 228 | 229 | 230 | 231 | [{"data":{"encoding":"Hexadecimal","hashType":2,"input":[{"data":{"environmentVariable":"70D58A8C-0AC5-4ED2-B141-DB478F44348A"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},{"data":{"environmentVariable":"B5458D8D-FB9B-41E6-B0C2-B483B7972D7B"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"}],"uppercase":0},"identifier":"com.luckymarmot.HashDynamicValue"}] 232 | 233 | 234 | 235 | 236 | [{"data":{"environmentVariable":"608F3431-FB19-48FC-AE15-996C7D44C3AB"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},{"data":{"environmentVariable":"14CD7C53-4EEA-4A91-997D-94C8AC30867B"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"}] 237 | 238 | 239 | 240 | 241 | CC6DE0A1-EC21-4D3F-AA1B-4C06006E4B45 242 | 2 243 | encrypet_password 244 | 245 | 246 | 247 | 248 | C4DE684D-62FA-4F1B-99BA-6710468A4B2D 249 | 3 250 | user_password 251 | 252 | 253 | 254 | 255 | 41635 256 | 257 | 258 | 259 | 260 | CE62BA1B-77E4-4ED0-B603-EFC8D7C20CB3 261 | 4 262 | app_id 263 | 264 | 265 | 266 | 267 | [{"data":{"encoding":"Hexadecimal","hashType":2,"input":[{"data":{"environmentVariable":"C4DE684D-62FA-4F1B-99BA-6710468A4B2D"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"}],"uppercase":0},"identifier":"com.luckymarmot.HashDynamicValue"}] 268 | 269 | 270 | 271 | 272 | B5458D8D-FB9B-41E6-B0C2-B483B7972D7B 273 | 4 274 | md5_user_password 275 | 276 | 277 | 278 | 279 | BBC5024E-958D-4DEF-A9EA-90F64D090A8D 280 | 5 281 | balance_sign 282 | 283 | 284 | 285 | 286 | [{"data":{"name":"slice","input":"[{\\"data\\":{\\"algorithm_name\\":\\"md5_bytes\\",\\"input\\":\\"[{\\\\\\"data\\\\\\":{\\\\\\"environmentVariable\\\\\\":\\\\\\"79085216-8474-42FD-B224-959C2BB34E84\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.luckymarmot.EnvironmentVariableDynamicValue\\\\\\"}]\\",\\"slice\\":\\"0,2\\"},\\"identifier\\":\\"com.seaify.algorithms\\"}]","slice":"0,8"},"identifier":"com.seaify.utils"}] 287 | 288 | 289 | 290 | 291 | http://captcha.qq.com/getimage 292 | 293 | 294 | 295 | 296 | C682DDFA-41C7-471A-BF2A-0D52C7BDBC94 297 | 0 298 | image_url 299 | 300 | 301 | 302 | 303 | C7FDF687-E7D6-48C0-9BB4-12A661305A1A 304 | 2 305 | default 306 | 307 | 308 | 309 | 310 | B7BDE867-A008-41CF-9C01-EA8FAC1EB7C1 311 | 0 312 | Default Environment 313 | 314 | 315 | 316 | 317 | 3777C087-9325-40C3-AD9A-44291FAC0958 318 | 6 319 | post_sign 320 | 321 | 322 | 323 | 324 | [{"data":{"name":"slice","input":"[{\\"data\\":{\\"algorithm_name\\":\\"md5_bytes\\",\\"input\\":\\"[{\\\\\\"data\\\\\\":{\\\\\\"environmentVariable\\\\\\":\\\\\\"79085216-8474-42FD-B224-959C2BB34E84\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.luckymarmot.EnvironmentVariableDynamicValue\\\\\\"},\\\\\\",\\\\\\",{\\\\\\"data\\\\\\":{\\\\\\"algorithm_name\\\\\\":\\\\\\"bytes\\\\\\",\\\\\\"input\\\\\\":\\\\\\"[{\\\\\\\\\\\\\\"data\\\\\\\\\\\\\\":{\\\\\\\\\\\\\\"environmentVariable\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"C682DDFA-41C7-471A-BF2A-0D52C7BDBC94\\\\\\\\\\\\\\"},\\\\\\\\\\\\\\"identifier\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"com.luckymarmot.EnvironmentVariableDynamicValue\\\\\\\\\\\\\\"}]\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.seaify.algorithms\\\\\\"}]\\"},\\"identifier\\":\\"com.seaify.algorithms\\"}]","slice":"0,8"},"identifier":"com.seaify.utils"}] 325 | 326 | 327 | 328 | 329 | 330 | 0 331 | 332 | 1 333 | 334 | 335 | 336 | 337 | 338 | 339 | 0BBE0478-FC09-4D0E-B775-F8172D8E5C83 340 | [{"data":{"environmentVariable":"3F0E126E-80EB-42FC-948F-9BB3056D1789"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},{"data":{"environmentVariable":"FBBFC2D5-CB61-419A-8CB5-EB3ED5A91547"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\\/app\\/d2File?appID=",{"data":{"environmentVariable":"CE62BA1B-77E4-4ED0-B603-EFC8D7C20CB3"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600pwd=",{"data":{"environmentVariable":"CC6DE0A1-EC21-4D3F-AA1B-4C06006E4B45"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600user=",{"data":{"environmentVariable":"295648E5-FC22-4DA5-BDBF-F1CC230CB8A0"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600sign=",{"data":{"environmentVariable":"E5DB6E5E-AEA1-4EC5-8E65-CE93C3830923"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600type=200"] 341 | 1 342 | 1 343 | 0 344 | 0 345 | POST 346 | 0 347 | [{"data":{"keyValues":[[["file"],[{"data":{"environmentVariable":"EAA39355-4AEE-4E2E-A045-F581429182EC"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"}],true]]},"identifier":"com.luckymarmot.BodyFormKeyValueDynamicValue"}] 348 | 2 349 | 上传本地图片 350 | 351 | 352 | 353 | 354 | 355 | EAA39355-4AEE-4E2E-A045-F581429182EC 356 | 1 357 | local_image 358 | 359 | 360 | 361 | 362 | [{"data":{"bookmarkData":"Ym9vawwDAAAAAAQQMAAAADd0PQYQdOxQtgbG0fvrhs8X8AieUr+fzZ4+Vj\\/7j2o\\/CAIAAAQAAAADAwAAABgAKAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGNodWNrAAAABgAAAAEBAABzZWFpZnkAAAQAAAABAQAAbWluZREAAAABAQAAY29uZmlybWF0aW9uX2NvZGUAAAAIAAAAAQEAADAzNDkuYm1wGAAAAAEGAAAQAAAAIAAAADAAAABAAAAATAAAAGgAAAAIAAAABAMAADAHEgAAAAAACAAAAAQDAABBBxIAAAAAAAgAAAAEAwAAJuMaAAAAAAAIAAAABAMAAC30HgAAAAAACAAAAAQDAAAPInIAAAAAAAgAAAAEAwAAjtG0AAAAAAAYAAAAAQYAAJgAAACoAAAAuAAAAMgAAADYAAAA6AAAAAgAAAAABAAAQboHMHYAAAAYAAAAAQIAAAEAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAgAAAAEAwAABAAAAAAAAAAEAAAAAwMAAPUBAAAIAAAAAQkAAGZpbGU6Ly8vDAAAAAEBAABNYWNpbnRvc2ggSEQIAAAABAMAAAAgiD06AAAACAAAAAAEAABBut2ozAAAACQAAAABAQAARTRDNjRCM0ItRjM0Ni0zNTE1LTlDODItQjQ3QzUxRjAwRUUwGAAAAAECAACBAAAAAQAAAO8TAAABAAAAAAAAAAAAAAABAAAAAQEAAC8AAAAAAAAAAQUAAMwAAAD+\\/\\/\\/\\/AQAAAAAAAAAQAAAABBAAAHgAAAAAAAAABRAAAPgAAAAAAAAAEBAAACgBAAAAAAAAQBAAABgBAAAAAAAAAiAAAPQBAAAAAAAABSAAAGQBAAAAAAAAECAAAHQBAAAAAAAAESAAAKgBAAAAAAAAEiAAAIgBAAAAAAAAEyAAAJgBAAAAAAAAICAAANQBAAAAAAAAMCAAAAACAAAAAAAAAcAAAEgBAAAAAAAAEcAAACAAAAAAAAAAEsAAAFgBAAAAAAAAENAAAAQAAAAAAAAA"},"identifier":"com.luckymarmot.FileContentDynamicValue"}] 363 | 364 | 365 | 366 | 367 | E5DB6E5E-AEA1-4EC5-8E65-CE93C3830923 368 | 7 369 | local_image_sign 370 | 371 | 372 | 373 | 374 | a63b2cb2 375 | 376 | 377 | 378 | 379 | 380 | 0 381 | 382 | 1 383 | 384 | 385 | 386 | 387 | 388 | 389 | 25BD1B1C-CB27-4258-BB89-D5F0B4E9C8EB 390 | [{"data":{"environmentVariable":"3F0E126E-80EB-42FC-948F-9BB3056D1789"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},{"data":{"environmentVariable":"FBBFC2D5-CB61-419A-8CB5-EB3ED5A91547"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\\/app\\/d2ReportError?appID=",{"data":{"environmentVariable":"CE62BA1B-77E4-4ED0-B603-EFC8D7C20CB3"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600pwd=",{"data":{"environmentVariable":"CC6DE0A1-EC21-4D3F-AA1B-4C06006E4B45"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600user=",{"data":{"environmentVariable":"295648E5-FC22-4DA5-BDBF-F1CC230CB8A0"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"},"\u2600sign=",{"data":{"name":"slice","input":"[{\\"data\\":{\\"algorithm_name\\":\\"md5_bytes\\",\\"input\\":\\"[{\\\\\\"data\\\\\\":{\\\\\\"environmentVariable\\\\\\":\\\\\\"79085216-8474-42FD-B224-959C2BB34E84\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.luckymarmot.EnvironmentVariableDynamicValue\\\\\\"},\\\\\\",\\\\\\",{\\\\\\"data\\\\\\":{\\\\\\"algorithm_name\\\\\\":\\\\\\"bytes\\\\\\",\\\\\\"input\\\\\\":\\\\\\"[{\\\\\\\\\\\\\\"data\\\\\\\\\\\\\\":{\\\\\\\\\\\\\\"param\\\\\\\\\\\\\\":[\\\\\\\\\\\\\\"id\\\\\\\\\\\\\\"]},\\\\\\\\\\\\\\"identifier\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"com.luckymarmot.RequestURLParamDynamicValue\\\\\\\\\\\\\\"}]\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.seaify.algorithms\\\\\\"}]\\"},\\"identifier\\":\\"com.seaify.algorithms\\"}]","slice":"0,8"},"identifier":"com.seaify.utils"},"\u2600id=",{"data":{"request":"D920AAAA-8410-442D-853A-14A0B421DFE1","keyPath":["id"],"format":1},"identifier":"com.luckymarmot.ResponseBodyPathDynamicValue"}] 391 | 1 392 | 1 393 | 0 394 | 0 395 | POST 396 | 0 397 | 3 398 | 报告验证码错误 399 | 400 | 401 | 402 | 403 | 404 | A7EC29CE-ECD4-4238-9A9D-DAA9B7D9781E 405 | 8 406 | report_sign 407 | 408 | 409 | 410 | 411 | 4ae46be1 412 | 413 | 414 | 415 | 416 | 79085216-8474-42FD-B224-959C2BB34E84 417 | 9 418 | bytes_key_user 419 | 420 | 421 | 422 | 423 | [{"data":{"algorithm_name":"bytes","input":"[{\\"data\\":{\\"environmentVariable\\":\\"70D58A8C-0AC5-4ED2-B141-DB478F44348A\\"},\\"identifier\\":\\"com.luckymarmot.EnvironmentVariableDynamicValue\\"}]"},"identifier":"com.seaify.algorithms"},",",{"data":{"algorithm_name":"bytes","input":"[{\\"data\\":{\\"environmentVariable\\":\\"295648E5-FC22-4DA5-BDBF-F1CC230CB8A0\\"},\\"identifier\\":\\"com.luckymarmot.EnvironmentVariableDynamicValue\\"}]"},"identifier":"com.seaify.algorithms"}] 424 | 425 | 426 | 427 | 428 | 0A9FC8FF-CCEF-439F-AA50-88F52F7C8E15 429 | 10 430 | post_sign1 431 | 432 | 433 | 434 | 435 | [{"data":{"name":"slice","input":"[{\\"data\\":{\\"algorithm_name\\":\\"md5_bytes\\",\\"input\\":\\"[{\\\\\\"data\\\\\\":{\\\\\\"environmentVariable\\\\\\":\\\\\\"79085216-8474-42FD-B224-959C2BB34E84\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.luckymarmot.EnvironmentVariableDynamicValue\\\\\\"},\\\\\\",\\\\\\",{\\\\\\"data\\\\\\":{\\\\\\"algorithm_name\\\\\\":\\\\\\"bytes\\\\\\",\\\\\\"input\\\\\\":\\\\\\"[{\\\\\\\\\\\\\\"data\\\\\\\\\\\\\\":{\\\\\\\\\\\\\\"param\\\\\\\\\\\\\\":[\\\\\\\\\\\\\\"ffe\\\\\\\\\\\\\\"]},\\\\\\\\\\\\\\"identifier\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"com.luckymarmot.RequestURLParamDynamicValue\\\\\\\\\\\\\\"}]\\\\\\"},\\\\\\"identifier\\\\\\":\\\\\\"com.seaify.algorithms\\\\\\"}]\\"},\\"identifier\\":\\"com.seaify.algorithms\\"}]","slice":"0,8"},"identifier":"com.seaify.utils"}] 436 | 437 | 438 | 439 | 440 | 1E2303CE-321C-4346-A163-86F0E30C6991 441 | 11 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | D44B9442-5950-420A-8EB5-011C75F740D5 453 | 2 454 | encode_image_url 455 | 456 | 457 | 458 | 459 | [{"data":{"input":[{"data":{"environmentVariable":"C682DDFA-41C7-471A-BF2A-0D52C7BDBC94"},"identifier":"com.luckymarmot.EnvironmentVariableDynamicValue"}],"mode":0,"charset":"utf-8"},"identifier":"com.luckymarmot.URLEncodingDynamicValue"}] 460 | 461 | 462 | 463 | 464 | 6FC18201-0A18-481A-8614-7311B605ED10 465 | 3 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | --------------------------------------------------------------------------------