搜索
热搜: 活动 交友 discuz
查看: 3009|回复: 8
收起左侧

[已提交] 请教鱼大, 开发打码插件时MarkResult功能函数需要重写吗?

[复制链接]

该用户从未签到

发表于 2019-12-26 11:30:44 | 显示全部楼层 |阅读模式
本帖最后由 lon91ong 于 2019-12-26 12:20 编辑

我感觉我在打一场通关游戏,被Python惯坏了的程序员老菜鸟重新捡起十多年没碰过的C,各种... 一言难尽啊!!!
现在应该是最后一关了,那个 MarkResult 功能函数是否需要重写编写呢?
如果需要,至少应该传入一个 Session 好让12306服务端知道是谁发回的打码答案吧?!
页端分析,似乎应该有个叫 call_back 的回传参数, 不知从哪获得

自己试着拼凑了下面的 MarkResult 但还是失败!
[C#] 纯文本查看 复制代码
        public override void MarkResult(IVerifyCodeRecognizeResult result, bool correct)
        {
            RestClient client = new RestClient("https:  /kyfw.12306.cn/"); //论坛权限不够发URL
            client.AddDefaultHeader("Accept", "*/*");
            RestRequest req = new RestRequest("passport/captcha/captcha-check", Method.GET);
            req.AddHeader("Referrer Policy", "no - referrer - when - downgrade");
            req.AddQueryParameter("answer", result.Code); // 字符串格式: 42,34,41,116,183,114
            req.AddQueryParameter("rand", "sjrand");
            req.AddQueryParameter("login_site", "E");
            req.AddQueryParameter("_", DateTime.Now.GetHashCode().ToString());
            IRestResponse resp = client.Execute(req);
            dynamic json = JsonConvert.DeserializeObject(resp.Content);
            if(json.result_code == "4")
            {
                correct = true;
            }
            else
            {
                correct = false;
            }
        }








  • TA的每日心情
    奋斗
    2019-1-5 01:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    发表于 2019-12-26 21:08:15 | 显示全部楼层
    不,这个函数不需要你重写。这个函数是用来报错的。比如你的码是通过远程打码识别的,这个过程需要钱,如果识别错误,需要上报错误码,好把钱要回来。

    参数的correct是告诉你这个码是正确的还是错误的。

    该用户从未签到

     楼主| 发表于 2019-12-27 09:45:17 | 显示全部楼层
    本帖最后由 lon91ong 于 2019-12-27 09:57 编辑
    木魚 发表于 2019-12-26 21:08
    不,这个函数不需要你重写。这个函数是用来报错的。比如你的码是通过远程打码识别的,这个过程需要钱,如果 ...

    那我就不明白了, 我写到下面的 GetCode 功能应该够了吧, 怎么还是不行?返回值字符串形式应该是什么格式的?

    [C#] 纯文本查看 复制代码
            public override IVerifyCodeRecognizeResult GetCode(Image image)
            {
                ImageConverter _imageConverter = new ImageConverter();
                byte[] imgBytes = (byte[])_imageConverter.ConvertTo(image, typeof(byte[]));
                // Convert byte[] to Base64 String
                //string base64img = Convert.ToBase64String(imgBytes);
                RestClient client = new RestClient("http: /127.0.0.1:80/");
                client.AddDefaultHeader("Accept", "application/json");
                client.AddDefaultHeader("Accept-Encoding", "gzip");
                RestRequest req = new RestRequest("create.json", Method.POST);
                req.AddHeader("cache-control", "no-cache");
                req.AddParameter("soft_id", "2992", ParameterType.QueryString);
                req.AddFileBytes("image", imgBytes, "1.png");
                IRestResponse resp = client.Execute(req);
                dynamic json = JsonConvert.DeserializeObject(resp.Content);
                // json.Result目前返回的格式是: x,y,x,y 这样坐标int数值组成的字符串; 图片序号: 2,5,7 这样的格式也试过
                Result res = new Result(image, json.Result, "00000201912300992999", VerifyCodeRecognizeType.Text, null);
                return res;
            }
        }



  • TA的每日心情
    奋斗
    2019-1-5 01:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    发表于 2019-12-28 01:51:38 | 显示全部楼层
    你这已经有坐标结果了。那么参考如下这段示例代码:

    [C#] 纯文本查看 复制代码
    class VerifyCodeRecognizeResult : IVerifyCodeRecognizeResult
    {
    	public Image Image { get; }
    
    	public string Code { get; }
    
    	public string Id { get; }
    
    	public VerifyCodeRecognizeType CodeType { get; }
    
    	public Point[] Points { get; }
    
    	public VerifyCodeRecognizeResult(string id, VerifyCodeRecognizeType type, string code, Point[] points, Image img)
    	{
    		Image = img;
    		Code = code;
    		Id = id;
    		Points = points;
    		CodeType = type;
    	}
    
    	public static IVerifyCodeRecognizeResult CreatePointsResultFromText(string id, string text, Image img)
    	{
    		var arr = text.Split(',');
    		var pts = new Point[arr.Length / 2];
    
    		for (int i = 0; i < pts.Length; i++)
    		{
    			pts[i] = new Point(int.Parse(arr[i * 2]), int.Parse(arr[i * 2 + 1]));
    		}
    
    		return new VerifyCodeRecognizeResult(id, VerifyCodeRecognizeType.Points, null, pts, img);
    	}
    }


    这样新建结果并返回:
    [C#] 纯文本查看 复制代码
    return 	VerifyCodeRecognizeResult.CreatePointsResultFromText(
    	"",	//ID,如不需要标记验证码唯一性可以不传或传null
    	"1,2,3,4",	//坐标序列,格式为 x1,y1,x2,y2...
    	null	//原始的Image
    	);

    该用户从未签到

     楼主| 发表于 2019-12-28 13:01:25 | 显示全部楼层
    本帖最后由 lon91ong 于 2019-12-28 13:24 编辑
    木魚 发表于 2019-12-28 01:51
    你这已经有坐标结果了。那么参考如下这段示例代码:

    首先感谢鱼大的回应。
    看到你给出的代码,我第一印象就是“这个方法我已经试过了”,参见大前天的帖子8#

    但我还是不自信,跟着你的代码重新做了一遍,问题照旧!
    怀疑自己对C#的返回值格式有错误的理解,直接在dll项目上调试也不会,新建了console项目测试过了返回值,也没有发现问题

    So,耐心基本耗光了,自身也没有太强的抢票需求,放弃了

    放出全部代码,会有接盘侠吗

    [C#] 纯文本查看 复制代码
    using System;
    using System.Drawing;
    using RestSharp;
    using Newtonsoft.Json;
    using System.Net;
    
    namespace TOBA.AutoVc {
        internal class VerifyCodeRecognizeResult: IVerifyCodeRecognizeResult {
            public Image Image { get; }
            public string Code { get; }
            public string Id { get; }
            public VerifyCodeRecognizeType CodeType { get; }
            public Point[] Points { get; }
            public VerifyCodeRecognizeResult(string id, VerifyCodeRecognizeType type, string code, Point[] points, Image img) {
                Image = img;
                Code = code;
                Id = id;
                CodeType = type;
                points = Points;
            }
            public static IVerifyCodeRecognizeResult CreatePointsResultFromText(string id, string text, Image img) {
                var arr = text.Split(',');
                var pts = new Point[arr.Length / 2];
    
                for (int i = 0; i < pts.Length; i++) {
                    pts[i] = new Point(int.Parse(arr[i * 2]), int.Parse(arr[i * 2 + 1]));
                }
    
                return new VerifyCodeRecognizeResult(id, VerifyCodeRecognizeType.Points, null, pts, img);
            }
        }
        internal class LocalVcService: AbstractVerifyCodeRecognizeService {
            public LocalVcService() {
                base.Author = "lon91ong";
                base.ErrorCodeQueryUrl = "http: /localhost:80/"; //没有发URL权限
                base.Name = "本地打码";
                base.WebUrl = "http: /localhost:80/"; //没有发URL权限
                this.ProviderName = "本地打码";
            }
    
            public override void Load() {
                base.Load();
                base.Verified = true;
                base.ErrorCode = 0;
            }
    
            public override bool DoLogin() {
                base.IsLoggedIn = true;
                base.IsEnabled = true;
                base.Score = 10000;
                return true;
            }
    
            public override bool Logout() {
                base.IsLoggedIn = false;
                base.IsEnabled = false;
                return true;
            }
    
            public override bool RefreshScore() {
                base.Score = 10000;
                return true;
            }
    
            public override string Id {
                get {
                    return "localVc";
                }
            }
    
            public override void MarkResult(IVerifyCodeRecognizeResult result, bool correct) {}
    
            public override IVerifyCodeRecognizeResult GetCode(Image image) {
                ImageConverter _imageConverter = new ImageConverter();
                byte[] imgBytes = (byte[]) _imageConverter.ConvertTo(image, typeof(byte[]));
                // Convert byte[] to Base64 String
                //string base64img = Convert.ToBase64String(imgBytes);
                RestClient client = new RestClient("http: /127.0.0.1:80/"); //没有发URL权限
                client.AddDefaultHeader("Accept", "application/json");
                client.AddDefaultHeader("Accept-Encoding", "gzip");
                RestRequest req = new RestRequest("create.json", Method.POST);
                req.AddHeader("cache-control", "no-cache");
                req.AddParameter("soft_id", "2992", ParameterType.QueryString);
                req.AddFileBytes("image", imgBytes, "1.png");
                IRestResponse resp = client.Execute(req);
                dynamic json = JsonConvert.DeserializeObject(resp.Content);
                /*var sArray = json.Result.Split(',');
                var pts = new Point[sArray.Length >> 1 ];
                for(int i=0;i<pts.Length;i++)
                {
                    pts[i] = new Point(int.Parse(sArray[2*i]), int.Parse(sArray[2*i + 1]));
                }
                return new VerifyCodeRecognizeResult("00000201912300992999", VerifyCodeRecognizeType.Text, json.Result, null, image);*/
                return VerifyCodeRecognizeResult.CreatePointsResultFromText(null, json.Result, image);
            }
        }
    }



  • TA的每日心情
    奋斗
    2019-1-5 01:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    发表于 2019-12-28 22:36:51 | 显示全部楼层
    楼主,接口代码以及示例代码已经放出了。

    https://github.com/iccfish/Cn123 ... mo/DemoVcService.cs

    该用户从未签到

     楼主| 发表于 2019-12-29 13:11:56 | 显示全部楼层
    木魚 发表于 2019-12-28 22:36
    楼主,接口代码以及示例代码已经放出了。

    https://github.com/iccfish/Cn12306UnofficalClient/blob/maste ...

    失败依旧, 而且 Thread.Sleep(3000); 并没有起到暂停的作用。

    点评

    嗯,我犯了一个错误,由于GitHub仓库中的AutoVc.dll的签名和官方发布的文件中的签名是不一样的,所以基于它编译出来的DLL无法在官方发布的订票助手.NET中加载,只能引用官方发布版本中的DLL文件。 所以我更新了GitH  详情 回复 发表于 2019-12-29 15:44
  • TA的每日心情
    奋斗
    2019-1-5 01:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    发表于 2019-12-29 15:44:23 | 显示全部楼层
    lon91ong 发表于 2019-12-29 13:11
    失败依旧, 而且 Thread.Sleep(3000); 并没有起到暂停的作用。

    嗯,我犯了一个错误,由于GitHub仓库中的AutoVc.dll的签名和官方发布的文件中的签名是不一样的,所以基于它编译出来的DLL无法在官方发布的订票助手.NET中加载,只能引用官方发布版本中的DLL文件。

    所以我更新了GitHub,请参考最新的版本相关说明:https://github.com/iccfish/Cn12306UnofficalClient/tree/master/src

    另附上这个版本的项目编译后的测试文件,经测试是可用的。




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?入住

    x

    该用户从未签到

     楼主| 发表于 2019-12-29 19:53:19 | 显示全部楼层
    木魚 发表于 2019-12-29 15:44
    嗯,我犯了一个错误,由于GitHub仓库中的AutoVc.dll的签名和官方发布的文件中的签名是不一样的,所以基于 ...

    之前我测试也没有用GitHub代码直接编译AutoVc.dll, 我用的VS2015, 似乎语法细节处与2019有出入, 编译提示一堆错, 我直接参考GitHub代码修改的旧版AutoVc.dll文件。
    今天去监考的时候想起来,C#的语法比Python严格太多了,可能是我在类型转换方面不够细心。
    刚刚试了试,确实是那个json解析得到的结果 json.Result 不经过转换直接当String用了,加入一步转换就好了!
    经过这一番折腾,深刻地体会到Python前辈的口头禅“人生苦短,我用Python”其中的至理。
    您需要登录后才可以回帖 登录 | 入住

    本版积分规则

    申请友链| Archiver| 手机版| 鱼·后花园

    GMT+8, 2024-11-23 11:33 , Processed in 0.030371 second(s), 24 queries , Redis On.

    Powered by Discuz! X3.4

    © 2005-2024 鱼·后花园

    快速回复 返回顶部 返回列表