C# 終本案件、綜合執行人、裁判文書爬蟲

来源:https://www.cnblogs.com/mldcy/archive/2018/09/19/9675361.html
-Advertisement-
Play Games

終本案件:http://zxgk.court.gov.cn/zhongben/new_index.html 綜合執行人:http://zxgk.court.gov.cn/zhixing/new_index.html 裁判文書:http://wenshu.court.gov.cn 終本案件和執行人爬取 ...


終本案件:http://zxgk.court.gov.cn/zhongben/new_index.html

綜合執行人:http://zxgk.court.gov.cn/zhixing/new_index.html

裁判文書:http://wenshu.court.gov.cn

  終本案件和執行人爬取還是挺簡單的,沒有涉及到加密,驗證碼也可以直接識別過掉,主要是網站不是很穩定,經常出現502,504,500錯誤,涉及到一些失敗重連機制。IP限制我們用的是撥號來解決的,客戶對於速度的要求不是很

高,考慮到客戶預算有限沒有上優質HTTP代理。

  本來開始是用的.net4.5的httpclient,但是在實際的抓取過程當中發現這個類庫有BUG,釋放SOCKET的時間需要很長。後改用從4.0開始就一直在使用的RestSharp來做訪問,問題得到解決,網頁解析類庫採用的是anglesharp,解

析速度還是不錯的。由於網站經常出現訪問錯誤,已經有些數據查詢會直接讓網站報500,所以採用了Polly來做超時和重試。

  外包項目,直接做的類庫給他們調用沒有寫界面,前兩個沒什麼好說的,主要來說說文書爬蟲。

 

  文書獲取列表頁的時候需要提交三個參數:GUID\Code\VL5X ,GUID是隨機數生成的,我們可以直接使用

Guid.NewGuid().ToString("D");

  生成GUID就可以了,Code是訪問網頁返回的,帶上GUID訪問返回明文的Code,訪問網址:/ValiCode/GetCode

        private string GetCode(RestClient client)
        {
            cc:
            PageId = Guid.NewGuid().ToString("D");
            var rsp = "/ValiCode/GetCode".PostAsResponse(client, "guid=" + PageId);
            if (!ProcessResponse(rsp, client))
            {
                goto cc;
            }
            return rsp.Content;
        }

  ProcessResponse是做的訪問結果判斷是否需要過驗證碼或者撥號

  

private bool ProcessResponse(IRestResponse rsp, RestClient client)
        {
            if (rsp.StatusCode == HttpStatusCode.BadGateway || rsp.StatusCode == HttpStatusCode.GatewayTimeout)
            {
                Reconnection(DialerInfo);
                return false;
            }
            if (rsp.Content.Contains("網站當前訪問量較大,請輸入驗證碼後繼續訪問"))
            {
                Reconnection(DialerInfo);
                var buffer = client.Execute(new RestRequest(string.Format("waf_captcha/?{0}", DateTime.Now.Ticks))).RawBytes;
                var captcha = Helpers.ProcessImage(buffer, buffer.Length);
                rsp.Content = client.Execute(new RestRequest("waf_verify.htm?captcha=" + captcha)).Content;
                return false;
            }
            foreach (var s in ProhibitKey)
            {
                if (rsp.Content.Contains(s))
                {
                    Reconnection(DialerInfo);
                    return false;
                }
            }
            return true;
        }

  目前發現的幾個關鍵字:

        //被封IP時候出現的關鍵詞

        public static string[] ProhibitKey = new[]
        {
            "網站當前訪問量較大,請輸入驗證碼後繼續訪問",
            "請開啟JavaScript並刷新該頁",
            "源站出現問題,暫時無法訪問",
        };

  VL5X是根據Cookie來計算的值,Cookie是帶上guid\code訪問得到的:

private string GetCookie(string name, string code, RestClient client)
        {
            cc:
            var rsp =
                string.Format("/list/list/?sorttype=1&number={0}&guid={1}&conditions=searchWord+QWJS+++{2}", code, PageId, "全文檢索:" + name)
                    .GetAsResponse(client);
            if (!ProcessResponse(rsp, client))
            {
                goto cc;
            }

            var cookie = rsp.Cookies.FirstOrDefault(x => x.Name == "vjkl5");
            if (cookie == null)
            {
                Reconnection(DialerInfo);
                goto cc;
            }

            return cookie.Value;
        }

  拿到cookie後,根據js加密出vl5x的值,加密的JS:(JS我改寫了,調用getValue這個方法,傳入cookie就可以返回vl5x的值)

 

   1 function strToLong(str) {
   2 var long = 0;
   3 for (var i = 0; i < str.length; i++) {
   4     long += (str.charCodeAt(i) << (i % 16))
   5 }
   6 return long
   7 }
   8 function strToLongEn(str) {
   9 var long = 0;
  10 for (var i = 0; i < str.length; i++) {
  11     long += (str.charCodeAt(i) << (i % 16)) + i
  12 }
  13 return long
  14 }
  15 function strToLongEn2(str, step) {
  16 var long = 0;
  17 for (var i = 0; i < str.length; i++) {
  18     long += (str.charCodeAt(i) << (i % 16)) + (i * step)
  19 }
  20 return long
  21 }
  22 function strToLongEn3(str, step) {
  23 var long = 0;
  24 for (var i = 0; i < str.length; i++) {
  25     long += (str.charCodeAt(i) << (i % 16)) + (i + step - str.charCodeAt(i))
  26 }
  27 return long
  28 }
  29 function makeKey_0(str) {
  30 var str = str.substr(5, 5 * 5) + str.substr((5 + 1) * (5 + 1), 3);
  31 var a = str.substr(5) + str.substr( - 4);
  32 var b = str.substr(4) + a.substr( - 6);
  33 return hex_md5(str).substr(4, 24)
  34 }
  35 function makeKey_1(str) {
  36 var str = str.substr(5, 5 * 5) + "5" + str.substr(1, 2) + "1" + str.substr((5 + 1) * (5 + 1), 3);
  37 var a = str.substr(5) + str.substr(4);
  38 var b = str.substr(12) + a.substr( - 6);
  39 var c = str.substr(4) + a.substr(6);
  40 return hex_md5(c).substr(4, 24)
  41 }
  42 function makeKey_2(str) {
  43 var str = str.substr(5, 5 * 5) + "15" + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3);
  44 var a = strToLong(str.substr(5)) + str.substr(4);
  45 var b = strToLong(str.substr(5)) + str.substr(4);
  46 var c = str.substr(4) + b.substr(5);
  47 return hex_md5(c).substr(1, 24)
  48 }
  49 function makeKey_3(str) {
  50 var str = str.substr(5, 5 * 5) + "15" + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3);
  51 var a = strToLongEn(str.substr(5)) + str.substr(4);
  52 var b = str.substr(4) + a.substr(5);
  53 var c = strToLong(str.substr(5)) + str.substr(4);
  54 return hex_md5(b).substr(3, 24)
  55 }
  56 function makeKey_4(str) {
  57 var str = str.substr(5, 5 * 5) + "2" + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3);
  58 var long = 0;
  59 for (var i = 0; i < str.substr(1).length; i++) {
  60     long += (str.charCodeAt(i) << (i % 16))
  61 }
  62 var aa = long + str.substr(4);
  63 var long = 0;
  64 var a = str.substr(5);
  65 for (var i = 0; i < a.length; i++) {
  66     long += (a.charCodeAt(i) << (i % 16)) + i
  67 }
  68 a = long + "" + str.substr(4);
  69 var b = hex_md5(str.substr(1)) + strToLong(a.substr(5));
  70 return hex_md5(b).substr(3, 24)
  71 }
  72 function makeKey_5(str) {
  73 var base = new Base64();
  74 var str = base.encode(str.substr(5, 5 * 5) + str.substr(1, 2) + "1") + str.substr((5 + 1) * (5 + 1), 3);
  75 var a = strToLongEn(str.substr(4, 10)) + str.substr( - 4);
  76 var b = hex_md5(str.substr(4)) + a.substr(2);
  77 var a = str.substr(3);
  78 var c = strToLong(str.substr(5)) + str.substr(4);
  79 var aa = long + str.substr(4);
  80 var long = 0;
  81 for (var i = 0; i < a.length; i++) {
  82     long += (a.charCodeAt(i) << (i % 12)) + i
  83 }
  84 a = long + "" + str.substr(4);
  85 return hex_md5(str).substr(4, 24)
  86 }
  87 function makeKey_6(str) {
  88 var base = new Base64();
  89 var str = str.substr(5, 5 * 5) + str.substr((5 + 1) * (5 + 1), 3);
  90 var a = base.encode(str.substr(4, 10)) + str.substr(2);
  91 var b = str.substr(6) + a.substr(2);
  92 var c = strToLong(str.substr(5)) + str.substr(4);
  93 var aa = long + str.substr(4);
  94 var long = 0;
  95 var a = str.substr(5);
  96 for (var i = 0; i < a.length; i++) {
  97     long += (a.charCodeAt(i) << (i % 16)) + i
  98 }
  99 a = long + "" + str.substr(4);
 100 return hex_md5(b).substr(2, 24)
 101 }
 102 function makeKey_7(str) {
 103 var base = new Base64();
 104 var str = base.encode(str.substr(5, 5 * 4) + "55" + str.substr(1, 2)) + str.substr((5 + 1) * (5 + 1), 3);
 105 var long = 0;
 106 for (var i = 0; i < str.substr(1).length; i++) {
 107     long += (str.charCodeAt(i) << (i % 16 + 5)) + 3 + 5
 108 }
 109 var aa = long + str.substr(4);
 110 var long = 0;
 111 var a = str.substr(5);
 112 for (var i = 0; i < a.length; i++) {
 113     long += (a.charCodeAt(i) << (i % 16))
 114 }
 115 a = long + "" + str.substr(4);
 116 var b = hex_md5(str.substr(1)) + strToLong(a.substr(5));
 117 return hex_md5(b).substr(3, 24)
 118 }
 119 function makeKey_8(str) {
 120 var base = new Base64();
 121 var str = base.encode(str.substr(5, 5 * 5 - 1) + "5" + "-" + "5") + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3);
 122 var long = 0;
 123 for (var i = 0; i < str.substr(1).length; i++) {
 124     long += (str.charCodeAt(i) << (i % 16))
 125 }
 126 var aa = long + str.substr(4);
 127 var long = 0;
 128 var a = str.substr(5);
 129 for (var i = 0; i < a.length; i++) {
 130     long += (a.charCodeAt(i) << (i % 16))
 131 }
 132 a = long + "" + str.substr(4);
 133 var b = hex_md5(str.substr(1)) + strToLongEn(a.substr(5));
 134 return hex_md5(b).substr(4, 24)
 135 }
 136 function makeKey_9(str) {
 137 var str = str.substr(5, 5 * 5) + "5" + str.substr(1, 2) + "1" + str.substr((5 + 1) * (5 + 1), 3);
 138 var a = str.substr(5) + str.substr(4);
 139 var b = str.substr(12) + a.substr( - 6);
 140 var c = hex_sha1(str.substr(4)) + a.substr(6);
 141 return hex_md5(c).substr(4, 24)
 142 }
 143 function makeKey_10(str) {
 144 var base = new Base64();
 145 var str = base.encode(str.substr(5, 5 * 5 - 1) + "5") + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3);
 146 var long = 0;
 147 for (var i = 0; i < str.substr(1).length; i++) {
 148     long += (str.charCodeAt(i) << (i % 16))
 149 }
 150 var aa = long + str.substr(4);
 151 var long = 0;
 152 var a = str.substr(5);
 153 for (var i = 0; i < a.length; i++) {
 154     long += (a.charCodeAt(i) << (i % 16))
 155 }
 156 a = long + "" + str.substr(4);
 157 var b = hex_md5(str.substr(1)) + hex_sha1(a.substr(5));
 158 return hex_md5(b).substr(4, 24)
 159 }
 160 function makeKey_11(str) {
 161 var base = new Base64();
 162 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3);
 163 var long = 0;
 164 for (var i = 0; i < str.substr(1).length; i++) {
 165     long += (str.charCodeAt(i) << (i % 16))
 166 }
 167 var aa = long + str.substr(4);
 168 var long = 0;
 169 var a = str.substr(5);
 170 for (var i = 0; i < a.length; i++) {
 171     long += (a.charCodeAt(i) << (i % 16))
 172 }
 173 a = long + "" + str.substr(2);
 174 var b = str.substr(1) + hex_sha1(a.substr(5));
 175 return hex_md5(b).substr(2, 24)
 176 }
 177 function makeKey_12(str) {
 178 var base = new Base64();
 179 var str = str.substr(5, 5 * 5 - 1) + str.substr((5 + 1) * (5 + 1), 3) + "2" + str.substr(1, 2);
 180 var long = 0;
 181 for (var i = 0; i < str.substr(1).length; i++) {
 182     long += (str.charCodeAt(i) << (i % 16))
 183 }
 184 var aa = long + str.substr(4);
 185 var long = 0;
 186 var a = str.substr(5);
 187 for (var i = 0; i < a.length; i++) {
 188     long += (a.charCodeAt(i) << (i % 16))
 189 }
 190 a = long + "" + str.substr(2);
 191 var b = str.substr(1) + hex_sha1(str.substr(5));
 192 return hex_md5(b).substr(1, 24)
 193 }
 194 function makeKey_13(str) {
 195 var base = new Base64();
 196 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2);
 197 var long = 0;
 198 for (var i = 0; i < str.substr(1).length; i++) {
 199     long += (str.charCodeAt(i) << (i % 16))
 200 }
 201 var aa = long + str.substr(4);
 202 var long = 0;
 203 var a = str.substr(5);
 204 for (var i = 0; i < a.length; i++) {
 205     long += (a.charCodeAt(i) << (i % 16))
 206 }
 207 a = long + "" + str.substr(2);
 208 var b = base.encode(str.substr(1) + hex_sha1(str.substr(5)));
 209 return hex_md5(b).substr(1, 24)
 210 }
 211 function makeKey_14(str) {
 212 var base = new Base64();
 213 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2);
 214 var long = 0;
 215 for (var i = 0; i < str.substr(1).length; i++) {
 216     long += (str.charCodeAt(i) << (i % 16))
 217 }
 218 var aa = long + str.substr(4);
 219 var long = 0;
 220 var a = str.substr(5);
 221 for (var i = 0; i < a.length; i++) {
 222     long += (a.charCodeAt(i) << (i % 16))
 223 }
 224 a = long + "" + str.substr(2);
 225 var b = base.encode(str.substr(1) + str.substr(5) + str.substr(1, 3));
 226 return hex_sha1(b).substr(1, 24)
 227 }
 228 function makeKey_15(str) {
 229 var base = new Base64();
 230 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2);
 231 var long = 0;
 232 for (var i = 0; i < str.substr(1).length; i++) {
 233     long += (str.charCodeAt(i) << (i % 16))
 234 }
 235 var aa = long + str.substr(4);
 236 var long = 0;
 237 var a = str.substr(5);
 238 for (var i = 0; i < a.length; i++) {
 239     long += (a.charCodeAt(i) << (i % 16))
 240 }
 241 a = long + "" + str.substr(2);
 242 var b = base.encode(a.substr(1) + str.substr(5) + str.substr(2, 3));
 243 return hex_sha1(b).substr(1, 24)
 244 }
 245 function makeKey_16(str) {
 246 var base = new Base64();
 247 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2) + "-" + "5";
 248 var long = 0;
 249 for (var i = 0; i < str.substr(1).length; i++) {
 250     long += (str.charCodeAt(i) << (i % 11))
 251 }
 252 var aa = long + str.substr(4);
 253 var long = 0;
 254 var a = str.substr(5);
 255 for (var i = 0; i < a.length; i++) {
 256     long += (a.charCodeAt(i) << (i % 16)) + i
 257 }
 258 a = long + "" + str.substr(2);
 259 var b = base.encode(a.substr(1)) + strToLongEn2(str.substr(5), 5) + str.substr(2, 3);
 260 return hex_md5(b).substr(2, 24)
 261 }
 262 function makeKey_17(str) {
 263 var base = new Base64();
 264 var str = str.substr(5, 5 * 5 - 1) + "7" + str.substr(1, 2) + "-" + "5";
 265 var long = 0;
 266 for (var i = 0; i < str.substr(1).length; i++) {
 267     long += (str.charCodeAt(i) << (i % 11))
 268 }
 269 var aa = long + str.substr(4);
 270 var long = 0;
 271 var a = str.substr(5);
 272 for (var i = 0; i < a.length; i++) {
 273     long += (a.charCodeAt(i) << (i % 16)) + i
 274 }
 275 a = long + "" + str.substr(2);
 276 var b = base.encode(a.substr(1)) + strToLongEn2(str.substr(5), 5 + 1) + str.substr(2 + 5, 3);
 277 return hex_md5(b).substr(0, 24)
 278 }
 279 function makeKey_18(str) {
 280 var base = new Base64();
 281 var str = str.substr(5, 5 * 5 - 1) + "7" + str.substr(1, 2) + "5" + str.substr(2 + 5, 3);
 282 var long = 0;
 283 for (var i = 0; i < str.substr(1).length; i++) {
 284     long += (str.charCodeAt(i) << (i % 11))
 285 }
 286 var aa = long + str.substr(4);
 287 var long = 0;
 288 var a = str.substr(5);
 289 for (var i = 0; i < a.length; i++) {
 290     long += (a.charCodeAt(i) << (i % 16)) + i
 291 }
 292 a = long + "" + str.substr(2);
 293 var b = a.substr(1) + strToLongEn2(str.substr(5), 5 + 1) + str.substr(2 + 5, 3);
 294 return hex_md5(b).substr(0, 24)
 295 }
 296 function makeKey_19(str) {
 297 var base = new Base64();
 298 var str = str.substr(5, 5 * 5 - 1) + "7" + str.substr(5, 2) + "5" + str.substr(2 + 5, 3);
 299 var long = 0;
 300 for (var i = 0; i < str.substr(1).length; i++) {
 301     long += (str.charCodeAt(i) << (i % 11))
 302 }
 303 var aa = long + str.substr(4);
 304 var long = 0;
 305 var a = str.substr(5);
 306 for (var i = 0; i < a.length; i++) {
 307     long += (a.charCodeAt(i) << (i % 16)) + i
 308 }
 309 a = long + "" + str.substr(2);
 310 var b = a.substr(1) + strToLongEn3(str.substr(5), 5 - 1) + str.substr(2 + 5, 3);
 311 return hex_md5(b).substr(0, 24)
 312 }
 313 function makeKey_20(str) {
 314 return hex_md5(makeKey_10(str) + makeKey_5(str)).substr(1, 24)
 315 }
 316 function makeKey_21(str) {
 317 return hex_md5(makeKey_11(str) + makeKey_3(str)).substr(2, 24)
 318 }
 319 function makeKey_22(str) {
 320 return hex_md5(makeKey_14(str) + makeKey_19(str)).substr(3, 24)
 321 }
 322 function makeKey_23(str) {
 323 return hex_md5(makeKey_15(str) + makeKey_0(str)).substr(4, 24)
 324 }
 325 function makeKey_24(str) {
 326 return hex_md5(makeKey_16(str) + makeKey_1(str)).substr(1, 24)
 327 }
 328 function makeKey_25(str) {
 329 return hex_md5(makeKey_9(str) + makeKey_4(str)).substr(2, 24)
 330 }
 331 function makeKey_26(str) {
 332 return hex_md5(makeKey_10(str) + makeKey_5(str)).substr(3, 24)
 333 }
 334 function makeKey_27(str) {
 335 return hex_md5(makeKey_17(str) + makeKey_3(str)).substr(4, 24)
 336 }
 337 function makeKey_28(str) {
 338 return hex_md5(makeKey_18(str) + makeKey_7(str)).substr(1, 24)
 339 }
 340 function makeKey_29(str) {
 341 return hex_md5(makeKey_19(str) + makeKey_3(str)).substr(2, 24)
 342 }
 343 function makeKey_30(str) {
 344 return hex_md5(makeKey_0(str) + makeKey_7(str)).substr(3, 24)
 345 }
 346 function makeKey_31(str) {
 347 return hex_md5(makeKey_1(str) + makeKey_8(str)).substr(4, 24)
 348 }
 349 function makeKey_32(str) {
 350 return hex_md5(makeKey_4(str) + makeKey_14(str)).substr(3, 24)
 351 }
 352 function makeKey_33(str) {
 353 return hex_md5(makeKey_5(str) + makeKey_15(str)).substr(4, 24)
 354 }
 355 function makeKey_34(str) {
 356 return hex_md5(makeKey_3(str) + makeKey_16(str)).substr(1, 24)
 357 }
 358 function makeKey_35(str) {
 359 return hex_md5(makeKey_7(str) + makeKey_9(str)).substr(2, 24)
 360 }
 361 function makeKey_36(str) {
 362 return hex_md5(makeKey_8(str) + makeKey_10(str)).substr(3, 24)
 363 }
 364 function makeKey_37(str) {
 365 return hex_md5(makeKey_6(str) + makeKey_17(str)).substr(1, 24)
 366 }
 367 function makeKey_38(str) {
 368 return hex_md5(makeKey_12(str) + makeKey_18(str)).substr(2, 24)
 369 }
 370 function makeKey_39(str) {
 371 return hex_md5(makeKey_14(str) + makeKey_19(str)).substr(3, 24)
 372 }
 373 function makeKey_40(str) {
 374 return hex_md5(makeKey_15(str) + makeKey_0(str)).substr(4, 24)
 375 }
 376 function makeKey_41(str) {
 377 return hex_md5(makeKey_16(str) + makeKey_1(str)).substr(3, 24)
 378 }
 379 function

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • using SqlSugar; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; namespace Web.Code.DA... ...
  • 轉眼九月份了,忙忙碌碌 發現今年還沒開過張,寫一篇吧。 15年在空閑時就倒騰過angularjs那玩意兒 ,覺得還是挺好的,李金龍那厚厚的一本書,只不過沒有系統化應用。最主要的是原來有一個東西沒有用到 那就是路由。在中衡的時候看到黃國文同志用那種全ajax的方式做的網站,那感覺。。。現在公司竟然也這 ...
  • 嚴格意義上來說,簡單工廠模式並不屬於GoF的23種設計模式,但是它是學習其他工廠模式的基礎和前提條件。理解了簡單工廠模式,學習工廠方法模式和抽象工廠模式會比較容易一些。 簡單工廠模式的定義 定義一個工廠類,他可以根據不同的參數返回不同類的實例。通常情況下,被創建的類的實例通常都具有共同的父類。 簡單 ...
  • ModelValidator主要是應用在ModelMetadata元數據的類型上或類型屬性上。它是驗證的基礎類型,所有的ModelValidatorProviders、DataAnnotationValidator、DataAnnotationValidatorProvider都是主要通過GetVa ...
  • winform 程式調用Windows.Devices.Bluetoot API 實現windows下BLE藍牙設備自動連接,收發數據功能。不需要使用win10的UWP開發。 ...
  • 文檔繼續完善整理中。。。。。。 c.DocumentFilter<SwaggerDocTag>(); /// <summary> /// Swagger註釋幫助類 /// </summary> public class SwaggerDocTag : IDocumentFilter { /// <s ...
  • 添加引用. 綁定命令. ...
  • //定義原子變數 int mituxInt = -1; //原子級別+1值,如果>=0,說明當前鎖為空,可以執行,避免重覆執行 if (Interlocked.Increment(ref mituxInt) <= 0) { if (_serverThread == null || (_serverT... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...