-
Notifications
You must be signed in to change notification settings - Fork 0
/
local-search.xml
1574 lines (758 loc) · 812 KB
/
local-search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>小米平板6crDroid类原生安卓14系统刷机</title>
<link href="/2024/10/05/%E5%B0%8F%E7%B1%B3%E5%B9%B3%E6%9D%BF6crDroid%E7%B1%BB%E5%8E%9F%E7%94%9F%E5%AE%89%E5%8D%9314%E7%B3%BB%E7%BB%9F%E5%88%B7%E6%9C%BA/"/>
<url>/2024/10/05/%E5%B0%8F%E7%B1%B3%E5%B9%B3%E6%9D%BF6crDroid%E7%B1%BB%E5%8E%9F%E7%94%9F%E5%AE%89%E5%8D%9314%E7%B3%BB%E7%BB%9F%E5%88%B7%E6%9C%BA/</url>
<content type="html"><![CDATA[<h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><p><strong>刷机有风险,小白需谨慎!!!解锁会丢失所有数据,请做好数据备份!!!</strong></p><p>所谓「类原生」,是指基于 <strong>AOSP</strong>(Android Open Source Project,Android 开放源代码工程)开发的第三方固件,其界面与操作方式与谷歌官方的 Android 一致。</p><p>AOSP</p><p>?优点:「轻快」</p><p>大多界面简洁,有原生动画,</p><p>没有厂商预装系统软件和三方软件(差不多只有电话、短信、时钟、文件、设置、甚至没有浏览器),</p><p>没有太多花里胡哨的功能,系统后台占用率较少。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050812237.png"></p><p>对于安卓来说,刷机流程都大致一样</p><p>1.解锁 Bootloader<br>2.刷入 Recovery<br>3.刷入 ROM/Gapps/Magisk<br>4.开始愉快地玩耍</p><h2 id="开始"><a href="#开始" class="headerlink" title="开始"></a>开始</h2><h3 id="1-解锁BL(Bootloader)"><a href="#1-解锁BL(Bootloader)" class="headerlink" title="1.解锁BL(Bootloader)"></a>1.解锁BL(Bootloader)</h3><p>小米的系统现在解锁越来越难了,<a href="https://s.xiaomi.cn/c/3hfTCor6"><strong>小米澎湃 OS · Bootloader 解锁权限变更公告</strong></a>,需要实名认证+通过社区答题测试+社区 5 级账号。</p><blockquote><p>大家好! Bootloader 锁处于上锁状态时,有助于保护设备安全、避免数据泄露,也给用户提供更加安全、稳定的使用体验。自即日起,升级到小米澎湃 OS 后的 Bootloader 解锁权限将仅针对开发者和手机发烧友开放,感谢大家的支持和理解。</p></blockquote><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050811297.png"></p><p>不过好在有大佬搞了一个绕开的工具,只需要168小时就可以解锁了</p><p>工具下载地址: <a href="https://www.123865.com/s/FrsrVv-wB47A?%E6%8F%90%E5%8F%96%E7%A0%81:8ecC">https://www.123865.com/s/FrsrVv-wB47A?提取码:8ecC</a></p><p><strong>提示:解锁BL会清除所有数据,请及时备份</strong></p><p>具体方法:</p><p>1.usb调式界面的操作</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050820031.png" alt="image-20241005082032966"></p><p>2.安装旧版设置(上面链接有)<br>3.下载工具php8.39,电脑解压双击php目录下”bypass.cmd”脚本运行<br>4.出现这样就是成功了</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050821639.png" alt="image-20241005082121481"></p><p>5.小米解锁工具解锁,依旧要等168小时。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050821133.png" alt="image-20241005082144070"></p><p>6.好了,现在可以关闭本文了,7天后再来。</p><h3 id="2-开始刷机"><a href="#2-开始刷机" class="headerlink" title="2.开始刷机"></a>2.开始刷机</h3><p><strong>注意:确保使用基于 Android 13 固件的 MIUI 14,请勿尝试使用 HyperOS 固件运行此 ROM</strong></p><p>参考:<a href="https://github.com/DragonEmperor9480/pipa_notes">https://github.com/DragonEmperor9480/pipa_notes</a></p><p>如果使用的是 HyperOS,请按照以下步骤操作</p><blockquote><p>按照下面步骤 1 到 7 进行操作,然后使用命令 adb sideload fw_package_name.zip(将 fw_package_name.zip 替换为您下载的固件名称.zip)刷入区域固件<br>,刷入后,重新启动一次recovery并继续按照上述剩余步骤操作</p></blockquote><p>如果已经在使用 MIUI固件/第三方ROM,则可以跳过此步骤并按照以下步骤操作。</p><p>刷机资料文件: </p><p><a href="https://www.123865.com/s/FrsrVv-gB47A?%E6%8F%90%E5%8F%96%E7%A0%81:GgYS">https://www.123865.com/s/FrsrVv-gB47A?提取码:GgYS</a></p><ol><li>下载 rom 包以及 boot、dtbo 和 vendor_boot 等(链接里的所有文件)</li><li>将下载的文件放在一个文件夹中</li><li>重新启动到fastboot(按住电源 + 音量减)</li></ol><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050840173.png" alt="image-20241005083959513"></p><p>4.在电脑上,打开文件所在的文件夹,打开cmd 并依次运行以下命令(文件需要具体的路径):</p><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata">fastboot flash <span class="hljs-keyword">boot</span> <span class="hljs-keyword">boot</span>.img<br></code></pre></td></tr></table></figure><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">fastboot</span> flash dtbo dtbo.img<br></code></pre></td></tr></table></figure><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">fastboot</span> flash vendor_boot vendor_boot.img<br></code></pre></td></tr></table></figure><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">fastboot reboot recovery</span><br></code></pre></td></tr></table></figure><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050842939.png" alt="image-20241005084228825"></p><p>5.通过recovery格式化数据(如果刷入的是同一个系列的rom,这步可以省略)</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050844812.png" alt="image-20241005084442712"></p><p>6.重启一次 recovery(advanced -> reboot to recovery)</p><p>7.然后选择apply update 选择 adb sideload</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050847367.png" alt="image-20241005084705249"></p><p>8.还是在刚才的目录里打开cmd 刷入ROM包</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">adb sideload rom.<span class="hljs-built_in">zip</span>(将 rom.<span class="hljs-built_in">zip</span> 替换为下载的 rom 包名.<span class="hljs-built_in">zip</span>,最好是具体路径)<br></code></pre></td></tr></table></figure><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050850696.png" alt="image-20241005085041587"></p><p>9.有可能会卡到47%,弹出重启recovery 这时其实已经刷完机了,点击重启到recovery。</p><p>10.接下来就可以刷入Gapps(谷歌套件,上面链接里有)等第三方包了,刷入方法和上面一样,选择apply update 选择 adb sideload,CMD运行</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">adb</span> sideload gapps.zip<br></code></pre></td></tr></table></figure><p>11.刷完就点击 reboot system,重启系统,开始玩了~</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050856508.png" alt="image-20241005085650406"></p><h3 id="3-Magisk-安装"><a href="#3-Magisk-安装" class="headerlink" title="3.Magisk 安装"></a>3.Magisk 安装</h3><p>1.下载 Magisk apk 并安装</p><p><a href="https://github.com/topjohnwu/Magisk/releases">https://github.com/topjohnwu/Magisk/releases</a> </p><p>2.打开Magisk,①:安装 – ②:选择 boot.img – ③:开始修补文件 – ④:修补完成(修补生成 magisk_patched-xxx.img 文件在 Download 目录)</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050903510.jpg" alt="Magisk安装教程插图"></p><p>3.将修补完的文件传入刚才的ROM文件夹,进入 Bootloader 模式</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">adb reboot bootloader</span><br></code></pre></td></tr></table></figure><p>4.运行</p><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">fastboot flash <span class="hljs-keyword">boot </span>刚才修补的文件路径<br></code></pre></td></tr></table></figure><p>5.显示下面这三行代码,就是成功刷入了。再使用指令 <code>fastboot reboot</code> 重启。</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">Sending</span> 'boot' (<span class="hljs-number">131072</span> KB) OKAY<span class="hljs-meta"> [ 3.105s]</span><br><span class="hljs-attribute">Writing</span> 'boot' OKAY<span class="hljs-meta"> [ 0.404s]</span><br><span class="hljs-attribute">Finished</span>. Total time: <span class="hljs-number">3</span>.<span class="hljs-number">556</span>s<br></code></pre></td></tr></table></figure><p>6.显示Magisk的版本,就是刷好了的</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202410050903329.jpg" alt="Magisk安装教程插图4"></p><p>温馨提示:</p><p>如果刷入 <strong>magisk.img</strong> 不能开机,可以把前面提取的 <strong>boot.img</strong> 通过 <strong>fastboot</strong> 刷回去,恢复原 boot,一般都能正常开机!<br><strong>boot.img</strong> 保留一份在电脑,避免出问题了可以自救下!还原 boot 指令</p><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata">fastboot flash <span class="hljs-keyword">boot</span> <span class="hljs-keyword">boot</span>.img<br></code></pre></td></tr></table></figure><h2 id="结束"><a href="#结束" class="headerlink" title="结束"></a>结束</h2><p>好久没有刷机了,刷机方式也变了好多。通过这次刷机,又熟悉了一遍。</p><p>参考资料:</p><p><a href="https://xdaforums.com/f/xiaomi-pad-6.12759/">https://xdaforums.com/f/xiaomi-pad-6.12759/</a></p><p><a href="https://xdaforums.com/t/beta-crdroid-10-x-a14-pipa.4641070/">https://xdaforums.com/t/beta-crdroid-10-x-a14-pipa.4641070/</a></p><p><a href="https://xdaforums.com/t/rom-14-pipa-lmodroid-unofficial-aosp.4652823/">https://xdaforums.com/t/rom-14-pipa-lmodroid-unofficial-aosp.4652823/</a></p><p><a href="https://crdroid.net/pipa/10">https://crdroid.net/pipa/10</a></p><p><a href="https://magiskcn.com/">https://magiskcn.com/</a></p><p><a href="https://www.byboke.com/2569.html">https://www.byboke.com/2569.html</a></p><p><a href="https://github.com/DragonEmperor9480/pipa_notes?tab=readme-ov-file#installation-guide">https://github.com/DragonEmperor9480/pipa_notes?tab=readme-ov-file#installation-guide</a></p><p><a href="https://www.coolapk.com/feed/57324806?shareKey=MmVmOGZiYjliMzYwNjcwMDdmMjI~&shareUid=524513&shareFrom=com.coolapk.market_14.5.0">https://www.coolapk.com/feed/57324806?shareKey=MmVmOGZiYjliMzYwNjcwMDdmMjI~&shareUid=524513&shareFrom=com.coolapk.market_14.5.0</a></p><p><a href="https://www.youtube.com/watch?v=ytW2R3Laujg&t=254s">https://www.youtube.com/watch?v=ytW2R3Laujg&t=254s</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>ADB</tag>
<tag>安卓</tag>
<tag>刷机</tag>
<tag>小米平板6</tag>
</tags>
</entry>
<entry>
<title>Proxmox VE 8配置国内软件源并删除订阅弹窗</title>
<link href="/2024/09/17/ProxmoxVE8%E9%85%8D%E7%BD%AE%E5%9B%BD%E5%86%85%E8%BD%AF%E4%BB%B6%E6%BA%90%E5%B9%B6%E5%88%A0%E9%99%A4%E8%AE%A2%E9%98%85%E5%BC%B9%E7%AA%97/"/>
<url>/2024/09/17/ProxmoxVE8%E9%85%8D%E7%BD%AE%E5%9B%BD%E5%86%85%E8%BD%AF%E4%BB%B6%E6%BA%90%E5%B9%B6%E5%88%A0%E9%99%A4%E8%AE%A2%E9%98%85%E5%BC%B9%E7%AA%97/</url>
<content type="html"><![CDATA[<h1 id="删除订阅弹窗"><a href="#删除订阅弹窗" class="headerlink" title="删除订阅弹窗"></a>删除订阅弹窗</h1><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">sed -Ezi.bak <span class="hljs-string">"s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g"</span> <span class="hljs-regexp">/usr/</span>share<span class="hljs-regexp">/javascript/</span>proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy.service<br></code></pre></td></tr></table></figure><p>执行后清理浏览器缓存,重新登录验证。</p><h1 id="修改软件源"><a href="#修改软件源" class="headerlink" title="修改软件源"></a>修改软件源</h1><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs awk">mv <span class="hljs-regexp">/etc/</span>apt<span class="hljs-regexp">/sources.list.d/</span>pve-enterprise.list <span class="hljs-regexp">/etc/</span>apt<span class="hljs-regexp">/sources.list.d/</span>pve-enterprise.list.bak<br><span class="hljs-comment"># 屏蔽订阅企业源</span><br>wget https:<span class="hljs-regexp">//mi</span>rrors.ustc.edu.cn<span class="hljs-regexp">/proxmox/</span>debian<span class="hljs-regexp">/proxmox-release-bookworm.gpg -O /</span>etc<span class="hljs-regexp">/apt/</span>trusted.gpg.d/proxmox-release-bookworm.gpg<br>echo <span class="hljs-string">"deb https://mirrors.ustc.edu.cn/proxmox/debian bookworm pve-no-subscription"</span> > <span class="hljs-regexp">/etc/</span>apt<span class="hljs-regexp">/sources.list.d/</span>pve-no-subscription.list<br><span class="hljs-comment"># 使用Proxmox非企业版中科大源</span><br>sed -i <span class="hljs-string">'s|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g'</span> <span class="hljs-regexp">/etc/</span>apt/sources.list<br>sed -i <span class="hljs-string">'s|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g'</span> <span class="hljs-regexp">/etc/</span>apt/sources.list<br><span class="hljs-comment"># 将Debian官方源替换为中科大源</span><br>echo <span class="hljs-string">"deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription"</span> > <span class="hljs-regexp">/etc/</span>apt<span class="hljs-regexp">/sources.list.d/</span>ceph.list<br><span class="hljs-comment"># 替换Ceph源</span><br>sed -i <span class="hljs-string">'s|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g'</span> <span class="hljs-regexp">/usr/</span>share<span class="hljs-regexp">/perl5/</span>PVE/APLInfo.pm<br><span class="hljs-comment"># 替换CT镜像下载源(重启PVE才能生效)</span><br>apt update <br><span class="hljs-comment">#更新源列表</span><br>apt upgrade <br><span class="hljs-comment">#升级软件包</span><br>apt dist-upgrade <br><span class="hljs-comment">#升级系统</span><br>apt install openvswitch-switch<br><span class="hljs-comment">#安装OVS</span><br></code></pre></td></tr></table></figure>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Proxmox</tag>
<tag>Pve</tag>
</tags>
</entry>
<entry>
<title>青龙面板搭建教程</title>
<link href="/2024/09/17/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/"/>
<url>/2024/09/17/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/</url>
<content type="html"><![CDATA[<h1 id="青龙面板"><a href="#青龙面板" class="headerlink" title="青龙面板"></a>青龙面板</h1><p>青龙是 whyour 大佬写的一个定时任务管理平台,支持 Python3、JavaScript、Shell、Typescript,简单来说就是可以定时运行一些脚本,就比如说薅羊毛、签到、抢购等等,谁会跟羊毛过意不去呢?</p><p>青龙面板涵盖以下功能</p><p>支持多种脚本语言(python3、JavaScript、shell、typescript)</p><p>支持在线管理脚本、环境变量、配置文件</p><p>支持在线查看任务日志</p><p>支持秒级任务设置</p><p>支持系统级通知</p><p>支持暗黑模式</p><p>支持手机端操作</p><h2 id="搭建部署"><a href="#搭建部署" class="headerlink" title="搭建部署"></a>搭建部署</h2><p>推荐使用Docker进行部署,NAS或者面板(如宝塔、1Panel等)可以直接在镜像仓库搜索进行部署,如果是云服务器等先下载安装docker,再进行青龙的部署,从大佬的README中可以看到相关部署的教程,我这里搬运下</p><p>latest 镜像是基于 alpine 构建,debian 镜像是基于 debian-slim 构建。如果需要使用 alpine 不支持的依赖,建议使用 debian 镜像,下面是拉取镜像命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker pull whyour/qinglong:latest<br>docker pull whyour/qinglong:debian<br></code></pre></td></tr></table></figure><p>下面进行部署青龙</p><h3 id="docker-推荐"><a href="#docker-推荐" class="headerlink" title="docker (推荐)"></a>docker (推荐)</h3><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs livescript">curl -sSL get.docker.com | sh<br>docker run -dit <span class="hljs-string">\</span><br> -v $PWD/ql/data:/ql/data <span class="hljs-string">\</span><br> <span class="hljs-comment"># 冒号后面的 5700 为默认端口,如果设置了 QlPort, 需要跟 QlPort 保持一致</span><br> -p <span class="hljs-number">5700</span>:<span class="hljs-number">5700</span> <span class="hljs-string">\</span><br> <span class="hljs-comment"># 部署路径非必须,比如 /test</span><br> -e QlBaseUrl=<span class="hljs-string">"/"</span> <span class="hljs-string">\</span><br> <span class="hljs-comment"># 部署端口非必须,当使用 host 模式时,可以设置服务启动后的端口,默认 5700</span><br> -e QlPort=<span class="hljs-string">"5700"</span> <span class="hljs-string">\</span><br> --name qinglong <span class="hljs-string">\</span><br> --hostname qinglong <span class="hljs-string">\</span><br> --restart <span class="hljs-keyword">unless</span>-stopped <span class="hljs-string">\</span><br> whyour/qinglong:latest<br><br></code></pre></td></tr></table></figure><h3 id="docker-compose-推荐"><a href="#docker-compose-推荐" class="headerlink" title="docker-compose (推荐)"></a>docker-compose (推荐)</h3><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-comment"># curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose</span><br>mkdir qinglong<br>wget https:<span class="hljs-regexp">//</span>raw.githubusercontent.com<span class="hljs-regexp">/whyour/</span>qinglong<span class="hljs-regexp">/master/</span>docker/docker-compose.yml<br><br><span class="hljs-comment"># 启动</span><br>docker-compose up -d<br><span class="hljs-comment"># 停止</span><br>docker-compose down<br></code></pre></td></tr></table></figure><p>到此就完成了,然后在本地打开青龙面板界面,默认端口为5700,打开你的浏览器,访问 <a href="http://127.0.0.1:5700可进入安装向导,设置账户密码,按要求一步一步即可,推送可先不填,如果没有进入配置向导,可在终端执行以下命令查看账号密码">http://127.0.0.1:5700可进入安装向导,设置账户密码,按要求一步一步即可,推送可先不填,如果没有进入配置向导,可在终端执行以下命令查看账号密码</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">exec</span> -it qinglong <span class="hljs-built_in">cat</span> /ql/config/auth.json<br></code></pre></td></tr></table></figure><p>看到如下界面就完成了</p><p><img src="https://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/%E9%9D%92%E9%BE%99%E9%A6%96%E9%A1%B5.png"></p><h2 id="拔毛行动"><a href="#拔毛行动" class="headerlink" title="拔毛行动"></a>拔毛行动</h2><h3 id="拉取脚本仓库"><a href="#拉取脚本仓库" class="headerlink" title="拉取脚本仓库"></a>拉取脚本仓库</h3><p>在拉取脚本仓库之前需要先了解下拉取命令的格式,青龙有个内置命令:ql ,描述如下:</p><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs gherkin"><span class="hljs-comment"># 更新并重启青龙</span><br>ql update<br><span class="hljs-comment"># 运行自定义脚本extra.sh</span><br>ql extra<br><span class="hljs-comment"># 添加单个脚本文件</span><br>ql raw <span class="hljs-variable"><file_url></span><br><span class="hljs-comment"># 添加单个仓库的指定脚本</span><br>ql repo <span class="hljs-variable"><repo_url></span> <span class="hljs-variable"><whitelist></span> <span class="hljs-variable"><blacklist></span> <span class="hljs-variable"><dependence></span> <span class="hljs-variable"><branch></span> <span class="hljs-variable"><extensions></span><br><span class="hljs-comment"># 删除旧日志</span><br>ql rmlog <span class="hljs-variable"><days></span><br><span class="hljs-comment"># 启动tg-bot</span><br>ql bot<br><span class="hljs-comment"># 检测青龙环境并修复</span><br>ql check<br><span class="hljs-comment"># 重置登录错误次数</span><br>ql resetlet <br><span class="hljs-comment"># 禁用两步登录</span><br>ql resettfa<br><br></code></pre></td></tr></table></figure><p>参数 说明<br>file_url 脚本地址<br>repo_url 仓库地址<br>whitelist 拉取仓库时的白名单,即就是需要拉取的脚本的路径包含的字符串,多个竖线分割<br>blacklist 拉取仓库时的黑名单,即就是需要拉取的脚本的路径不包含的字符串,多个竖线分割<br>dependence 拉取仓库需要的依赖文件,会直接从仓库拷贝到scripts下的仓库目录,不受黑名单影响,多个竖线分割<br>extensions 拉取仓库的文件后缀,多个竖线分割<br>branch 拉取仓库的分支<br>days 需要保留的日志的天数<br>file_path 任务执行时的文件路径</p><p>对上述命令有个初步了解之后,再看拉库命令就明了很多了,首先我们先拉个6dy大佬写的JD签到做任务的库6dylan6/jdpro[2],登陆后选择订阅管理创建订阅,在名称一行输入拉库指令如下:</p><p>国内机(带代理):</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">ql repo https:<span class="hljs-regexp">//</span>js.jdpro.site<span class="hljs-regexp">/https:/</span><span class="hljs-regexp">/github.com/</span><span class="hljs-number">6</span>dylan6/jdpro.git <span class="hljs-string">"jd_|jx_|jddj_"</span> <span class="hljs-string">"backUp"</span> <span class="hljs-string">"^jd[^_]|USER|JD|function|sendNotify|utils"</span><br></code></pre></td></tr></table></figure><p>默认代理拉不了,自行找可用代理</p><p>国外机:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">ql repo https:<span class="hljs-regexp">//gi</span>thub.com<span class="hljs-regexp">/6dylan6/</span>jdpro.git <span class="hljs-string">"jd_|jx_|jddj_"</span> <span class="hljs-string">"backUp"</span> <span class="hljs-string">"^jd[^_]|USER|JD|function|sendNotify|utils"</span><br></code></pre></td></tr></table></figure><p>定时任务随意,要遵循crontab表达式规则,可以使用这个在线工具 <a href="https://tool.lu/crontab">https://tool.lu/crontab</a> 里面也有详细说明每个字段的意思</p><p><img src="https://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/%E5%88%9B%E5%BB%BA%E8%AE%A2%E9%98%85.png"></p><p>创建订阅</p><p>创建完成后可在订阅管理中看到刚刚创建的订阅,此时点击右侧运行等待拉库完成即可,后面会根据你设置的定时规则自动拉库,这样就做到自动更新脚本了</p><p><img src="https://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/%E8%BF%90%E8%A1%8C%E8%AE%A2%E9%98%85.png"></p><p>运行订阅</p><p>点击日志可以查看到拉库状态,我这里是已经拉完了,实际第一次拉库会显示添加XXX任务成功的log</p><p><img src="https://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/%E6%8B%89%E5%BA%93.png"></p><p>拉库</p><p>此时点击左侧定时任务,便可查看到刚刚拉下来的脚本了</p><p><img src="https://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/%E6%8B%89%E5%BA%93.png"></p><p>定时任务</p><p>这里的定时规则可以根据自己的需求改动,右侧也可以手动运行,查看日志看看是否运行错误,顶部更多可以创建视图进行分类,当脚本过多时不会显得太乱</p><p><img src="https://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1.png"></p><h3 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h3><p>我们只拉库还不行,此时运行可以发现,肯定是会报错的,通常表现为</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs subunit"># 缺少依赖<br><span class="hljs-keyword">Error: </span>Cannot find module ‘xx’<br><br>'xxxx' module not found<br><br># 缺少Python依赖<br>ModuleNotFoundError: No module named ‘xxx’<br><br># 拉库不完整,缺少相应文件,检查拉库命令重新拉库<br><span class="hljs-keyword">Error: </span>Cannot find module ‘./xx’<br></code></pre></td></tr></table></figure><p>对于缺少依赖的问题,可以在左侧依赖管理进行安装,通常需要安装的依赖如下所示:</p><p>NodeJs:</p><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs x86asm">crypto-<span class="hljs-keyword">js</span><br>prettytable<br>dotenv<br>jsdom<br>date-fns<br>tough-cookie<br>tslib<br>ws@<span class="hljs-number">7.4</span><span class="hljs-number">.3</span><br>ts-md5<br>jsdom -g<br>jieba<br><span class="hljs-built_in">fs</span><br>form-data<br>json5<br><span class="hljs-meta">global</span>-agent<br>png-<span class="hljs-keyword">js</span><br>@types/node<br>require<br>typescript<br><span class="hljs-keyword">js</span>-base64<br>axios<br>moment<br></code></pre></td></tr></table></figure><p>Python3:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs css">requests<br><span class="hljs-selector-tag">canvas</span><br>ping3<br>jieba<br>PyExecJS<br>aiohttp<br></code></pre></td></tr></table></figure><p>Linux:</p><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm"><span class="hljs-keyword">bizCode</span><br><span class="hljs-keyword"></span><span class="hljs-keyword">bizMsg</span><br><span class="hljs-keyword"></span>lxm<br></code></pre></td></tr></table></figure><p>安装失败可以在 系统设置 - 依赖设置 里面配置代理或者镜像源</p><p>我这里用的是这个</p><p>Node 软件包镜像源:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">https:<span class="hljs-regexp">//</span>registry.npmmirror.com<br></code></pre></td></tr></table></figure><p>Python 软件包镜像源:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">https:<span class="hljs-regexp">//</span>pypi.tuna.tsinghua.edu.cn/simple<br></code></pre></td></tr></table></figure><p>Linux 软件包镜像源:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">https:<span class="hljs-regexp">//mi</span>rrors.aliyun.com<br></code></pre></td></tr></table></figure><p>当然还是推荐对应的一键安装脚本QLDependency[3]:</p><p>一键安装单独青龙的依赖<br>国内版:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">exec</span> -it qinglong bash -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/FlechazoPh/QLDependency/main/Shell/QLOneKeyDependency.sh | bash)</span>"</span><br></code></pre></td></tr></table></figure><p>国外版:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">exec</span> -it qinglong bash -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://raw.githubusercontent.com/FlechazoPh/QLDependency/main/Shell/QLOneKeyDependency.sh | bash)</span>"</span><br></code></pre></td></tr></table></figure><p>【更新】 版本号 2.12+ 的新版本青龙安装失败请尝试:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">exec</span> -it qinglong bash -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://raw.githubusercontent.com/FlechazoPh/QLDependency/main/Shell/XinQLOneKey.sh | bash)</span>"</span><br></code></pre></td></tr></table></figure><p>其中 -it 后面的 qinglong 是容器的名字,替换成自己的就行,安装完成后重启下镜像即可。</p><h3 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h3><p>此时再去手动运行定时任务的时候,发现就可以运行了,但是又出现了一个问题,提示没有环境变量JD_COOKIE,我们这时候就需要抓取JD_COOKIE添加到环境变量中,具体抓取方法参考这里,添加到环境变量中</p><p><img src="https://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/%E5%88%9B%E5%BB%BAJD_COOKIE%E5%8F%98%E9%87%8F.png"></p><p>创建JD_COOKIE变量</p><p>也可以写在配置文件中</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-built_in">export</span> <span class="hljs-attribute">JD_COOKIE</span>=<span class="hljs-string">"xxxxxx"</span><br></code></pre></td></tr></table></figure><p>到这一步,这个羊毛基本算是可以薅下来啦!当然,实际运行和添加的一些其他的环境变量还是需要多看看jdpro的README和ISSUES还有一些教程,还有设置配置文件(拉库、任务、推送、环境变量等)、配置代理池(防止黑号)、推送服务等等需要自行摸索下,只要肯折腾都不难~</p><p>参考</p><p>whyour/qinglong: <a href="https://github.com/whyour/qinglong">https://github.com/whyour/qinglong</a></p><p>6dylan6/jdpro: <a href="https://github.com/6dylan6/jdpro">https://github.com/6dylan6/jdpro</a></p><p>FlechazoPh/QLDependency: <a href="https://github.com/FlechazoPh/QLDependency">https://github.com/FlechazoPh/QLDependency</a></p><p><a href="http://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/">http://mtnxu.com/2024/07/14/%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>青龙</tag>
</tags>
</entry>
<entry>
<title>白嫖CloudflareWorkers搭建DockerHub镜像加速服务</title>
<link href="/2024/06/22/%E7%99%BD%E5%AB%96CloudflareWorkers%E6%90%AD%E5%BB%BADockerHub%E9%95%9C%E5%83%8F%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1/"/>
<url>/2024/06/22/%E7%99%BD%E5%AB%96CloudflareWorkers%E6%90%AD%E5%BB%BADockerHub%E9%95%9C%E5%83%8F%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1/</url>
<content type="html"><![CDATA[<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>基于Cloudflare Workers 搭建 Docker Hub镜像加速服务。</p><ol><li>首先要注册一个Cloudflare账号。</li><li>Cloudflare账号下域名的一级域名,推荐万网注册个top域名,再转移到Cloudflare,很便宜的。</li><li>注意 Worker 每天每免费账号有次数限制,为10万次。每分钟为1000次。</li></ol><h1 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h1><p>登录到CF的仪表盘 <a href="https://dash.cloudflare.com/" title="https://dash.cloudflare.com/">https://dash.cloudflare.com/</a></p><p>点击 workers-and-pages > 创建应用程序 > 创建 Worker > 点击保存 >点击完成 > 编辑代码</p><p><a href="https://img.songxwn.com/file/42714dc1cfc9ed94abb70.png"><img src="https://img.songxwn.com/file/42714dc1cfc9ed94abb70.png"></a></p><h2 id="编辑代码"><a href="#编辑代码" class="headerlink" title="编辑代码"></a>编辑代码</h2><h3 id="编辑-worker-js-文件"><a href="#编辑-worker-js-文件" class="headerlink" title="编辑 worker.js 文件"></a>编辑 worker.js 文件</h3><p>编辑覆盖后,Ctrl + S 即可保存。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><code class="hljs JAVASCRIPT"><span class="hljs-keyword">import</span> <span class="hljs-variable constant_">HTML</span> <span class="hljs-keyword">from</span> <span class="hljs-string">'./docker.html'</span>;<br><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> {<br> <span class="hljs-keyword">async</span> <span class="hljs-title function_">fetch</span>(<span class="hljs-params">request</span>) {<br> <span class="hljs-keyword">const</span> url = <span class="hljs-keyword">new</span> <span class="hljs-title function_">URL</span>(request.<span class="hljs-property">url</span>);<br> <span class="hljs-keyword">const</span> path = url.<span class="hljs-property">pathname</span>;<br> <span class="hljs-keyword">const</span> originalHost = request.<span class="hljs-property">headers</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">"host"</span>);<br> <span class="hljs-keyword">const</span> registryHost = <span class="hljs-string">"registry-1.docker.io"</span>;<br> <span class="hljs-keyword">if</span> (path.<span class="hljs-title function_">startsWith</span>(<span class="hljs-string">"/v2/"</span>)) {<br> <span class="hljs-keyword">const</span> headers = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Headers</span>(request.<span class="hljs-property">headers</span>);<br> headers.<span class="hljs-title function_">set</span>(<span class="hljs-string">"host"</span>, registryHost);<br> <span class="hljs-keyword">const</span> registryUrl = <span class="hljs-string">`https://<span class="hljs-subst">${registryHost}</span><span class="hljs-subst">${path}</span>`</span>;<br> <span class="hljs-keyword">const</span> registryRequest = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Request</span>(registryUrl, {<br> <span class="hljs-attr">method</span>: request.<span class="hljs-property">method</span>,<br> <span class="hljs-attr">headers</span>: headers,<br> <span class="hljs-attr">body</span>: request.<span class="hljs-property">body</span>,<br> <span class="hljs-comment">// redirect: "manual",</span><br> <span class="hljs-attr">redirect</span>: <span class="hljs-string">"follow"</span>,<br> });<br> <span class="hljs-keyword">const</span> registryResponse = <span class="hljs-keyword">await</span> <span class="hljs-title function_">fetch</span>(registryRequest);<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(registryResponse.<span class="hljs-property">status</span>);<br> <span class="hljs-keyword">const</span> responseHeaders = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Headers</span>(registryResponse.<span class="hljs-property">headers</span>);<br> responseHeaders.<span class="hljs-title function_">set</span>(<span class="hljs-string">"access-control-allow-origin"</span>, originalHost);<br> responseHeaders.<span class="hljs-title function_">set</span>(<span class="hljs-string">"access-control-allow-headers"</span>, <span class="hljs-string">"Authorization"</span>);<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(registryResponse.<span class="hljs-property">body</span>, {<br> <span class="hljs-attr">status</span>: registryResponse.<span class="hljs-property">status</span>,<br> <span class="hljs-attr">statusText</span>: registryResponse.<span class="hljs-property">statusText</span>,<br> <span class="hljs-attr">headers</span>: responseHeaders,<br> });<br> } <span class="hljs-keyword">else</span> {<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-variable constant_">HTML</span>.<span class="hljs-title function_">replace</span>(<span class="hljs-regexp">/{{host}}/g</span>, originalHost), {<br> <span class="hljs-attr">status</span>: <span class="hljs-number">200</span>,<br> <span class="hljs-attr">headers</span>: {<br> <span class="hljs-string">"content-type"</span>: <span class="hljs-string">"text/html"</span><br> }<br> });<br> }<br> }<br>}<br><br></code></pre></td></tr></table></figure><h3 id="编辑-docker-html-文件"><a href="#编辑-docker-html-文件" class="headerlink" title="编辑 docker.html 文件"></a>编辑 docker.html 文件</h3><p>点击新建文件,创建此文件。ctrl + s 即可保存。</p><p><a href="https://img.songxwn.com/file/9feaf6bf445054b7b6308.png"><img src="https://img.songxwn.com/file/9feaf6bf445054b7b6308.png"></a></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><code class="hljs HTML"><span class="hljs-meta"><!DOCTYPE <span class="hljs-keyword">html</span>></span><br><span class="hljs-tag"><<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"zh-CN"</span>></span><br><span class="hljs-tag"><<span class="hljs-name">head</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"utf-8"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">title</span>></span>镜像使用说明<span class="hljs-tag"></<span class="hljs-name">title</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">style</span>></span><span class="language-css"></span><br><span class="language-css"> <span class="hljs-selector-tag">body</span> {</span><br><span class="language-css"> <span class="hljs-attribute">font-family</span>: <span class="hljs-string">'Roboto'</span>, sans-serif;</span><br><span class="language-css"> <span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span>;</span><br><span class="language-css"> <span class="hljs-attribute">padding</span>: <span class="hljs-number">0</span>;</span><br><span class="language-css"> <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#f4f4f4</span>;</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-selector-class">.header</span> {</span><br><span class="language-css"> <span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">135deg</span>, <span class="hljs-number">#667eea</span>, <span class="hljs-number">#764ba2</span>);</span><br><span class="language-css"> <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;</span><br><span class="language-css"> <span class="hljs-attribute">padding</span>: <span class="hljs-number">20px</span> <span class="hljs-number">0</span>;</span><br><span class="language-css"> <span class="hljs-attribute">text-align</span>: center;</span><br><span class="language-css"> <span class="hljs-attribute">box-shadow</span>: <span class="hljs-number">0</span> <span class="hljs-number">2px</span> <span class="hljs-number">4px</span> <span class="hljs-built_in">rgba</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0.1</span>);</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-selector-class">.container</span> {</span><br><span class="language-css"> <span class="hljs-attribute">max-width</span>: <span class="hljs-number">800px</span>;</span><br><span class="language-css"> <span class="hljs-attribute">margin</span>: <span class="hljs-number">40px</span> auto;</span><br><span class="language-css"> <span class="hljs-attribute">padding</span>: <span class="hljs-number">20px</span>;</span><br><span class="language-css"> <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#fff</span>;</span><br><span class="language-css"> <span class="hljs-attribute">box-shadow</span>: <span class="hljs-number">0</span> <span class="hljs-number">4px</span> <span class="hljs-number">8px</span> <span class="hljs-built_in">rgba</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0.1</span>);</span><br><span class="language-css"> <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">10px</span>;</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-selector-class">.content</span> {</span><br><span class="language-css"> <span class="hljs-attribute">margin-bottom</span>: <span class="hljs-number">20px</span>;</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-selector-class">.footer</span> {</span><br><span class="language-css"> <span class="hljs-attribute">text-align</span>: center;</span><br><span class="language-css"> <span class="hljs-attribute">padding</span>: <span class="hljs-number">20px</span> <span class="hljs-number">0</span>;</span><br><span class="language-css"> <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#333</span>;</span><br><span class="language-css"> <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;</span><br><span class="language-css"> }</span><br><span class="language-css"> pre {</span><br><span class="language-css"> <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#272822</span>;</span><br><span class="language-css"> <span class="hljs-attribute">color</span>: <span class="hljs-number">#f8f8f2</span>;</span><br><span class="language-css"> <span class="hljs-attribute">padding</span>: <span class="hljs-number">15px</span>;</span><br><span class="language-css"> <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">5px</span>;</span><br><span class="language-css"> <span class="hljs-attribute">overflow-x</span>: auto;</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-selector-tag">code</span> {</span><br><span class="language-css"> <span class="hljs-attribute">font-family</span>: <span class="hljs-string">'Source Code Pro'</span>, monospace;</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-selector-tag">a</span> {</span><br><span class="language-css"> <span class="hljs-attribute">color</span>: <span class="hljs-number">#4CAF50</span>;</span><br><span class="language-css"> <span class="hljs-attribute">text-decoration</span>: none;</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:hover</span> {</span><br><span class="language-css"> <span class="hljs-attribute">text-decoration</span>: underline;</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-keyword">@media</span> (<span class="hljs-attribute">max-width</span>: <span class="hljs-number">600px</span>) {</span><br><span class="language-css"> <span class="hljs-selector-class">.container</span> {</span><br><span class="language-css"> <span class="hljs-attribute">margin</span>: <span class="hljs-number">20px</span>;</span><br><span class="language-css"> <span class="hljs-attribute">padding</span>: <span class="hljs-number">15px</span>;</span><br><span class="language-css"> }</span><br><span class="language-css"> <span class="hljs-selector-class">.header</span> {</span><br><span class="language-css"> <span class="hljs-attribute">padding</span>: <span class="hljs-number">15px</span> <span class="hljs-number">0</span>;</span><br><span class="language-css"> }</span><br><span class="language-css"> }</span><br><span class="language-css"></span><span class="hljs-tag"></<span class="hljs-name">style</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://fonts.loli.net/css2?family=Roboto:wght@400;700&family=Source+Code+Pro:wght@400;700&display=swap"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>></span><br><span class="hljs-tag"></<span class="hljs-name">head</span>></span><br><span class="hljs-tag"><<span class="hljs-name">body</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"header"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">h1</span>></span>镜像使用说明<span class="hljs-tag"></<span class="hljs-name">h1</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">div</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"content"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">p</span>></span>为了加速镜像拉取,你可以使用以下命令设置 registry mirror:<span class="hljs-tag"></<span class="hljs-name">p</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">pre</span>></span><span class="hljs-tag"><<span class="hljs-name">code</span>></span>sudo tee /etc/docker/daemon.json <<span class="hljs-tag"><<span class="hljs-name">EOF</span></span><br><span class="hljs-tag">{</span><br><span class="hljs-tag"> "<span class="hljs-attr">registry-mirrors</span>"<span class="hljs-attr">:</span> ["<span class="hljs-attr">https:</span>//{{<span class="hljs-attr">host</span>}}"]</span><br><span class="hljs-tag">}</span><br><span class="hljs-tag"><span class="hljs-attr">EOF</span></<span class="hljs-attr">code</span>></span><span class="hljs-tag"></<span class="hljs-name">pre</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">p</span>></span>为了避免 Worker 用量耗尽,你可以手动 pull 镜像然后 re-tag 之后 push 至本地镜像仓库:<span class="hljs-tag"></<span class="hljs-name">p</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">pre</span>></span><span class="hljs-tag"><<span class="hljs-name">code</span>></span>docker pull {{host}}/library/alpine:latest # 拉取 library 镜像<br>docker pull {{host}}/coredns/coredns:latest # 拉取 coredns 镜像<span class="hljs-tag"></<span class="hljs-name">code</span>></span><span class="hljs-tag"></<span class="hljs-name">pre</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">div</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">div</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"footer"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">p</span>></span>Powered by Cloudflare Workers<span class="hljs-tag"></<span class="hljs-name">p</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">p</span>></span><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://blog.quickso.cn"</span> <span class="hljs-attr">target</span>=<span class="hljs-string">"_blank"</span>></span>访问博客<span class="hljs-tag"></<span class="hljs-name">a</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">div</span>></span><br><span class="hljs-tag"></<span class="hljs-name">body</span>></span><br><span class="hljs-tag"></<span class="hljs-name">html</span>></span><br><br></code></pre></td></tr></table></figure><h2 id="保存部署并配置触发器"><a href="#保存部署并配置触发器" class="headerlink" title="保存部署并配置触发器"></a>保存部署并配置触发器</h2><p>上述两个文件的代码保存后,选择部署 > 保存并部署</p><p><strong>成功的话会在页面下方出现绿色的提示:版本已保存,如果出现 <code>红色提示</code>,请你去上面的创建docker.html,<code>改成</code>其他的名称,如:<code>page.html</code>,然后在 <code>worker.js</code>开头的 <code>from后面</code>./docekr.html <code>替换</code>成./page.html。<code>再进行部署</code>!<code>必须提示版本已保存!</code></strong></p><p>点击左上角的项目连接,配置触发器。(自定义域名访问)</p><h2 id="自定义域名访问"><a href="#自定义域名访问" class="headerlink" title="自定义域名访问"></a>自定义域名访问</h2><p><a href="https://img.songxwn.com/file/9962e62885a1c71cec6a6.png"><img src="https://img.songxwn.com/file/9962e62885a1c71cec6a6.png"></a></p><h1 id="访问界面和配置docker如下"><a href="#访问界面和配置docker如下" class="headerlink" title="访问界面和配置docker如下"></a>访问界面和配置docker如下</h1><p><a href="https://img.songxwn.com/file/b6d67cec8571295d69f33.png"><img src="https://img.songxwn.com/file/b6d67cec8571295d69f33.png"></a></p><h1 id="参考来源"><a href="#参考来源" class="headerlink" title="参考来源"></a>参考来源</h1><p><a href="https://blog.lty520.faith/%E5%8D%9A%E6%96%87/%E8%87%AA%E5%BB%BAdocker-hub%E5%8A%A0%E9%80%9F%E9%95%9C%E5%83%8F/">https://blog.lty520.faith/博文/自建docker-hub加速镜像/</a></p><p><a href="https://songxwn.com/cf-works-DockerHub-Proxy/">https://songxwn.com/cf-works-DockerHub-Proxy/</a></p><p><a href="https://www.luomubiji.host/workers.html">https://www.luomubiji.host/workers.html</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Cloudflare</tag>
<tag>镜像</tag>
<tag>DockerHub</tag>
</tags>
</entry>
<entry>
<title>Final Cut Pro快捷键大全</title>
<link href="/2024/06/16/FinalCutProk%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%A4%A7%E5%85%A8/"/>
<url>/2024/06/16/FinalCutProk%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%A4%A7%E5%85%A8/</url>
<content type="html"><![CDATA[<p>非常有助于我们提高工作效率,备用一下下面的表格,在我们使用FCPX软件时,会非常轻松的查询到键盘与操作对应的说明。可以收藏以备不时之需!</p><h1 id="Final-Cut-Pro-X-键盘快捷键"><a href="#Final-Cut-Pro-X-键盘快捷键" class="headerlink" title="Final Cut Pro X 键盘快捷键"></a>Final Cut Pro X 键盘快捷键</h1><p><strong>通过 Contorl+F 输入关键词可以快速查找对应的快捷键</strong></p><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>隐藏应用程序</td><td>Command-H</td><td>隐藏 Final Cut Pro</td></tr><tr><td>隐藏其他应用程序</td><td>Option-Command-H</td><td>隐藏除 Final Cut Pro 之外的所有应用程序</td></tr><tr><td>键盘自定</td><td>Option-Command-K</td><td>打开命令编辑器</td></tr><tr><td>最小化</td><td>Command-M</td><td>最小化 Final Cut Pro</td></tr><tr><td>打开资源库</td><td>Command-O</td><td>打开现有资源库或新资源库</td></tr><tr><td>偏好设置</td><td>Command-逗号 (,)</td><td>打开 Final Cut Pro 的“偏好设置”窗口</td></tr><tr><td>退出</td><td>Command-Q</td><td>退出 Final Cut Pro</td></tr><tr><td>重做更改</td><td>Shift-Command-Z</td><td>重做上一个命令</td></tr><tr><td>撤销更改</td><td>Command-Z</td><td>撤销上一个命令</td></tr></tbody></table><h3 id="编辑"><a href="#编辑" class="headerlink" title="编辑"></a>编辑</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>调整音量(绝对)</td><td>Control-Option-L</td><td>将所有所选片段的音频音量调整为特定的 dB 值</td></tr><tr><td>调整音量(相对)</td><td>Control-L</td><td>使用相同的 dB 值来调整所有所选片段的音频音量</td></tr><tr><td>追加到故事情节</td><td>E</td><td>将所选部分添加到故事情节的结尾</td></tr><tr><td>试演:添加到试演</td><td>Control-Shift-Y</td><td>将所选片段添加到试演</td></tr><tr><td>试演:复制并粘贴效果</td><td>Option-Command-Y</td><td>复制试演中的片段并添加效果</td></tr><tr><td>试演:复制为试演</td><td>Option-Y</td><td>使用时间线片段和该片段(包括应用的效果)的复制版本创建试演,</td></tr><tr><td>试演:复制原始项</td><td>Shift-Command-Y</td><td>复制选定的试演片段,但不包括应用的效果</td></tr><tr><td>试演:替换并添加到试演</td><td>Shift-Y</td><td>创建试演并使用当前所选部分替换时间线片段</td></tr><tr><td>切割</td><td>Command-B</td><td>剪切浏览条或播放头位置处的主要故事情节片段(或所选部分)</td></tr><tr><td>全部切割</td><td>Shift-Command-B</td><td>剪切浏览条或播放头位置的所有片段</td></tr><tr><td>将片段项分开</td><td>Shift-Command-G</td><td>将所选项拆分为其组件部分</td></tr><tr><td>更改时间长度</td><td>Control-D</td><td>更改所选部分的时间长度</td></tr><tr><td>连接到主要故事情节</td><td>Q</td><td>将所选内容连接到主要故事情节</td></tr><tr><td>连接到主要故事情节 – 反向时序</td><td>Shift-Q</td><td>将所选内容连接到主要故事情节,并将所选内容的结束点与浏览条或播放头对齐</td></tr><tr><td>拷贝</td><td>Command-C</td><td>拷贝所选部分</td></tr><tr><td>创建试演</td><td>Command-Y</td><td>从所选部分创建试演</td></tr><tr><td>创建故事情节</td><td>Command-G</td><td>从连接的片段中的所选内容创建故事情节</td></tr><tr><td>剪切</td><td>Command-X</td><td>剪切所选部分</td></tr><tr><td>剪切和切换到检视器角度 1</td><td>1</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 1</td></tr><tr><td>剪切和切换到检视器角度 2</td><td>2</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 2</td></tr><tr><td>剪切和切换到检视器角度 3</td><td>3</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 3</td></tr><tr><td>剪切和切换到检视器角度 4</td><td>4</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 4</td></tr><tr><td>剪切和切换到检视器角度 5</td><td>5</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 5</td></tr><tr><td>剪切和切换到检视器角度 6</td><td>6</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 6</td></tr><tr><td>剪切和切换到检视器角度 7</td><td>7</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 7</td></tr><tr><td>剪切和切换到检视器角度 8</td><td>8</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 8</td></tr><tr><td>剪切和切换到检视器角度 9</td><td>9</td><td>将多机位片段剪切并切换到当前倾斜角度组的角度 9</td></tr><tr><td>Delete</td><td>Delete</td><td>删除所选时间线,拒绝所选浏览器,或移除直通编辑</td></tr><tr><td>仅删除所选部分</td><td>Option-Command-Delete</td><td>删除所选部分并将连接片段连接到产生的空隙片段</td></tr><tr><td>取消选择全部</td><td>Shift-Command-A</td><td>取消选择所有选定项目</td></tr><tr><td>复制</td><td>Command-D</td><td>复制浏览器选择</td></tr><tr><td>启用/停用片段</td><td>V</td><td>对所选部分启用或停用回放</td></tr><tr><td>展开音频/视频</td><td>Control-S</td><td>单独查看选定片段的音频和视频</td></tr><tr><td>展开/折迭音频组件</td><td>Control-Option-S</td><td>在时间线中展开或折迭所选部分的音频组件</td></tr><tr><td>延长编辑</td><td>Shift-X</td><td>将选定的编辑点延长到浏览条或播放头位置</td></tr><tr><td>向下扩展所选部分</td><td>Shift–下箭头键</td><td>在浏览器中,将下一个项目添加到所选内容</td></tr><tr><td>向上扩展所选部分</td><td>Shift–上箭头键</td><td>在浏览器中,将上一个项目添加到所选内容</td></tr><tr><td>最终确定试演</td><td>Option-Shift-Y</td><td>迭化试演并将其替换为试演挑选项</td></tr><tr><td>插入</td><td>W</td><td>在浏览条或播放头位置插入所选内容</td></tr><tr><td>插入/连接静帧</td><td>Option-F</td><td>在时间线的播放头或浏览条位置插入一个静帧,或将一个静帧从事件中的浏览条或播放头位置连接到时间线中的播放头位置</td></tr><tr><td>插入空隙</td><td>Option-W</td><td>在浏览条或播放头位置插入空隙片段</td></tr><tr><td>插入占位符</td><td>Option-Command-W</td><td>在浏览条或播放头位置插入占位符片段</td></tr><tr><td>从故事情节中提取</td><td>Option–Command–上箭头键</td><td>从故事情节举出选择并将其连接到产生的空隙片段</td></tr><tr><td>将音量调低 1 dB</td><td>Control-连字符键 (-)</td><td>将音量调低 1 dB</td></tr><tr><td>移动播放头位置</td><td>Control-P</td><td>通过输入时间码值移动播放头</td></tr><tr><td>新建复合片段</td><td>Option-G</td><td>创建新的复合片段(如果无选择,创建空复合片段)</td></tr><tr><td>向左挪动音频子帧</td><td>Option-逗号键 (,)</td><td>将选定的音频编辑点向左移动 1 个子帧,从而创建拆分编辑</td></tr><tr><td>向左挪动音频子帧很多</td><td>Option-Shift-逗号键 (,)</td><td>将选定的音频编辑点向左移动 10 个子帧,从而创建拆分编辑</td></tr><tr><td>向右挪动音频子帧</td><td>Option-句点键 (.)</td><td>将选定的音频编辑点向右移动 1 个子帧,从而创建拆分编辑</td></tr><tr><td>向右挪动音频子帧很多</td><td>Option-Shift-句点键 (.)</td><td>将选定的音频编辑点向右移动 10 个子帧,从而创建拆分编辑</td></tr><tr><td>向下挪动</td><td>Option–下箭头键</td><td>在动画编辑器中向下挪动选定关键帧的值</td></tr><tr><td>向左挪动</td><td>逗号键 (,)</td><td>将所选部分向左挪动 1 个单位</td></tr><tr><td>向左挪动很多</td><td>Shift-逗号键 (,)</td><td>将所选部分向左挪动 10 个单位</td></tr><tr><td>向右挪动</td><td>句点键 (.)</td><td>将所选部分向右挪动 1 个单位</td></tr><tr><td>向右挪动很多</td><td>Shift-句点键 (.)</td><td>将所选部分向右挪动 10 个单位</td></tr><tr><td>向上挪动</td><td>Option–上箭头键</td><td>在动画编辑器中向上挪动选定关键帧的值</td></tr><tr><td>打开试演</td><td>Y</td><td>打开选定的试演</td></tr><tr><td>覆盖连接</td><td>重音符 (`)</td><td>临时覆盖所选部分的片段连接</td></tr><tr><td>覆盖</td><td>D</td><td>在浏览条或播放头位置覆盖</td></tr><tr><td>覆盖 – 反向时序</td><td>Shift-D</td><td>从浏览条或播放头位置反向覆盖</td></tr><tr><td>覆盖到主要故事情节</td><td>Option–Command–下箭头键</td><td>在主要故事情节的浏览条或播放头位置覆盖</td></tr><tr><td>粘贴为连接</td><td>Option-V</td><td>粘贴选择并将其连接到主要故事情节</td></tr><tr><td>在播放头粘贴插入</td><td>Command-V</td><td>在浏览条或播放头位置插入剪贴板内容</td></tr><tr><td>上一个角度</td><td>Control–Shift–左箭头键</td><td>切换到多机位片段中的上一个角度</td></tr><tr><td>上一个音频角度</td><td>Option–Shift–左箭头键</td><td>切换到多机位片段中的上一个音频角度</td></tr><tr><td>上一个挑选项</td><td>Control–左箭头键</td><td>选择“试演”窗口中的上一个片段,使其成为试演挑选项</td></tr><tr><td>上一个视频角度</td><td>Shift–Command–左箭头键</td><td>切换到多机位片段中的上一个视频角度</td></tr><tr><td>将音量调高 1 dB</td><td>Control–等号键 (=)</td><td>将音量调高 1 dB</td></tr><tr><td>替换</td><td>Shift-R</td><td>使用浏览器中的所选部分来替换时间线中的所选片段</td></tr><tr><td>从开始处替换</td><td>Option-R</td><td>将时间线中的所选片段替换为浏览器选择,其中从其开始点开始</td></tr><tr><td>替换为空隙</td><td>Shift-Delete</td><td>将选定的时间线片段替换为空隙片段</td></tr><tr><td>全选</td><td>Command-A</td><td>选择所有片段</td></tr><tr><td>选择片段</td><td>C</td><td>选择时间线中指针下方的片段</td></tr><tr><td>选择左音频边缘</td><td>Shift–左方括号 ([)</td><td>对于展开视图中的音频/视频片段,选择音频编辑点的左边缘</td></tr><tr><td>选择左边缘</td><td>左方括号 ([)</td><td>选择编辑点的左边缘</td></tr><tr><td>选择左音频编辑边缘和右音频编辑边缘</td><td>Shift-反斜杠键 ()</td><td>对于展开视图中的音频/视频片段,选择音频编辑点的左边缘和右边缘</td></tr><tr><td>选择左编辑边缘和右编辑边缘</td><td>反斜杠键 ()</td><td>选择编辑点的左边缘和右边缘</td></tr><tr><td>选择下一个角度</td><td>Control–Shift–右箭头键</td><td>切换到多机位片段中的下一个角度</td></tr><tr><td>选择下一个音频角度</td><td>Option–Shift–右箭头键</td><td>切换到多机位片段中的下一个音频角度</td></tr><tr><td>选择下一个挑选项</td><td>Control–右箭头键</td><td>选择“试演”窗口中的下一个片段,使其成为试演挑选项</td></tr><tr><td>选择下一个视频角度</td><td>Shift–Command–右箭头键</td><td>切换到多机位片段中的下一个视频角度</td></tr><tr><td>选择右音频边缘</td><td>Shift–右方括号 (])</td><td>对于展开视图中的音频/视频片段,选择音频编辑点的右边缘</td></tr><tr><td>选择右边缘</td><td>右方括号 (])</td><td>选择编辑点的右边缘</td></tr><tr><td>设定附加所选部分结尾</td><td>Shift-Command-O</td><td>在播放头或浏览条位置设定附加范围选择结束点</td></tr><tr><td>设定附加所选部分开头</td><td>Shift-Command-I</td><td>在播放头或浏览条位置设定附加范围选择起始点</td></tr><tr><td>显示/隐藏精确度编辑器</td><td>Control-E</td><td>选择编辑点时,显示或隐藏精确度编辑器</td></tr><tr><td>吸附</td><td>N</td><td>打开或关闭吸附</td></tr><tr><td>单独播放</td><td>Option-S</td><td>单独播放时间线中选择的项</td></tr><tr><td>源媒体:音频和视频</td><td>Shift-1</td><td>打开音频/视频模式以将选择的视频和音频部分添加到时间线</td></tr><tr><td>源媒体:仅音频</td><td>Shift-3</td><td>打开仅音频模式以将选择的音频部分添加到时间线</td></tr><tr><td>源媒体:仅视频</td><td>Shift-2</td><td>打开仅视频模式以将选择的视频部分添加到时间线</td></tr><tr><td>切换到检视器角度 1</td><td>Option-1</td><td>将多机位片段切换到当前倾斜角度组的角度 1</td></tr><tr><td>切换到检视器角度 2</td><td>Option-2</td><td>将多机位片段切换到当前倾斜角度组的角度 2</td></tr><tr><td>切换到检视器角度 3</td><td>Option-3</td><td>将多机位片段切换到当前倾斜角度组的角度 3</td></tr><tr><td>切换到检视器角度 4</td><td>Option-4</td><td>将多机位片段切换到当前倾斜角度组的角度 4</td></tr><tr><td>切换到检视器角度 5</td><td>Option-5</td><td>将多机位片段切换到当前倾斜角度组的角度 5</td></tr><tr><td>切换到检视器角度 6</td><td>Option-6</td><td>将多机位片段切换到当前倾斜角度组的角度 6</td></tr><tr><td>切换到检视器角度 7</td><td>Option-7</td><td>将多机位片段切换到当前倾斜角度组的角度 7</td></tr><tr><td>切换到检视器角度 8</td><td>Option-8</td><td>将多机位片段切换到当前倾斜角度组的角度 8</td></tr><tr><td>切换到检视器角度 9</td><td>Option-9</td><td>将多机位片段切换到当前倾斜角度组的角度 9</td></tr><tr><td>切换故事情节模式</td><td>G</td><td>打开或关闭在时间线中拖移片段时构建故事情节的功能</td></tr><tr><td>修剪结尾处</td><td>Option–右方括号 (])</td><td>将选定或最顶部的片段的结尾处修剪到浏览条或播放头位置</td></tr><tr><td>修剪开始处</td><td>Option–左方括号 ([)</td><td>将片段开始点修剪到浏览条或播放头位置</td></tr><tr><td>修剪到所选部分</td><td>Option-反斜杠键 ()</td><td>将片段开始点和结束点修剪到范围选择</td></tr></tbody></table><h3 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>添加基本下三分之一</td><td>Control-Shift-T</td><td>将基本下三分之一字幕连接到主要故事情节</td></tr><tr><td>添加基本字幕</td><td>Control-T</td><td>将基本字幕连接到主要故事情节</td></tr><tr><td>添加默认音频效果</td><td>Option-Command-E</td><td>将默认音频效果添加到所选部分</td></tr><tr><td>添加默认转场</td><td>Command-T</td><td>将默认转场添加到所选部分</td></tr><tr><td>添加默认视频效果</td><td>Option-E</td><td>将默认视频效果添加到所选部分</td></tr><tr><td>颜色板:还原当前板控制</td><td>Option-Delete</td><td>还原当前“颜色板”面板中的控制</td></tr><tr><td>颜色板:切换到“颜色”面板</td><td>Control-Command-C</td><td>切换到颜色板中的“颜色”面板</td></tr><tr><td>颜色板:切换到“曝光”面板</td><td>Control-Command-E</td><td>切换到颜色板中的“曝光”面板</td></tr><tr><td>颜色板:切换到“饱和度”面板</td><td>Control-Command-S</td><td>切换到颜色板中的“饱和度”面板</td></tr><tr><td>拷贝效果</td><td>Option-Command-C</td><td>拷贝选定的效果及其设置</td></tr><tr><td>拷贝关键帧</td><td>Option-Shift-C</td><td>拷贝所选关键帧及其设置</td></tr><tr><td>剪切关键帧</td><td>Option-Shift-X</td><td>剪切所选关键帧及其设置</td></tr><tr><td>启用/停用平衡颜色</td><td>Option-Command-B</td><td>打开或关闭平衡色彩校正</td></tr><tr><td>匹配音频</td><td>Shift-Command-M</td><td>在片段之间匹配声音</td></tr><tr><td>匹配颜色</td><td>Option-Command-M</td><td>在片段之间匹配颜色</td></tr><tr><td>下一个文本</td><td>Option-Tab</td><td>导航到下一个文本项</td></tr><tr><td>粘贴属性</td><td>Shift-Command-V</td><td>将所选属性及其设置粘贴到所选部分</td></tr><tr><td>粘贴效果</td><td>Option-Command-V</td><td>将效果及其设置粘贴到所选部分</td></tr><tr><td>粘贴关键帧</td><td>Option-Shift-V</td><td>将关键帧及其设置粘贴到所选部分</td></tr><tr><td>上一个文本</td><td>Option-Shift-Tab</td><td>导航到上一个文本项</td></tr><tr><td>重新定时编辑器</td><td>Command-R</td><td>显示或隐藏重新定时编辑器</td></tr><tr><td>重新定时:创建正常速度分段</td><td>Shift-N</td><td>将选择设定为以正常 (100%) 速度播放</td></tr><tr><td>重新定时:保留</td><td>Shift-H</td><td>创建 2 秒静止分段</td></tr><tr><td>重新定时:还原</td><td>Option-Command-R</td><td>将选择还原为以正常 (100%) 速度向前播放</td></tr><tr><td>单独播放动画</td><td>Control-Shift-V</td><td>在视频动画编辑器中一次仅显示一个效果</td></tr></tbody></table><h3 id="常规"><a href="#常规" class="headerlink" title="常规"></a>常规</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>Delete</td><td>Delete</td><td>删除所选时间线,拒绝所选浏览器,或移除直通编辑</td></tr><tr><td>查找</td><td>Command-F</td><td>显示或隐藏“过滤器”窗口(浏览器中)或时间线索引(时间线中)</td></tr><tr><td>前往事件检视器</td><td>Option-Command-3</td><td>激活事件检视器</td></tr><tr><td>导入媒体</td><td>Command-I</td><td>从设备、摄像机或归档导入媒体</td></tr><tr><td>资源库属性</td><td>Control-Command-J</td><td>打开当前资源库的“资源库属性”检查器</td></tr><tr><td>移到废纸篓</td><td>Command-Delete</td><td>将选择移到 Finder 废纸篓</td></tr><tr><td>新项目</td><td>Command-N</td><td>创建新项目</td></tr><tr><td>项目属性</td><td>Command-J</td><td>打开当前项目的“属性”检查器</td></tr><tr><td>渲染全部</td><td>Control-Shift-R</td><td>启动当前项目的所有渲染任务</td></tr><tr><td>渲染所选部分</td><td>Control-R</td><td>开始选择的渲染任务</td></tr><tr><td>在 Finder 中显示</td><td>Shift-Command-R</td><td>在 Finder 中显示所选事件片段的源媒体文件</td></tr></tbody></table><h3 id="标记"><a href="#标记" class="headerlink" title="标记"></a>标记</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>添加标记</td><td>M</td><td>在浏览条或播放头位置添加标记</td></tr><tr><td>所有片段</td><td>Control-C</td><td>更改浏览器过滤器设置来显示所有片段</td></tr><tr><td>添加标记并修改</td><td>Option-M</td><td>添加标记并编辑标记文本</td></tr><tr><td>应用关键词标记 1</td><td>Control-1</td><td>将关键词 1 应用到所选部分</td></tr><tr><td>应用关键词标记 2</td><td>Control-2</td><td>将关键词 2 应用到所选部分</td></tr><tr><td>应用关键词标记 3</td><td>Control-3</td><td>将关键词 3 应用到所选部分</td></tr><tr><td>应用关键词标记 4</td><td>Control-4</td><td>将关键词 4 应用到所选部分</td></tr><tr><td>应用关键词标记 5</td><td>Control-5</td><td>将关键词 5 应用到所选部分</td></tr><tr><td>应用关键词标记 6</td><td>Control-6</td><td>将关键词 6 应用到所选部分</td></tr><tr><td>应用关键词标记 7</td><td>Control-7</td><td>将关键词 7 应用到所选部分</td></tr><tr><td>应用关键词标记 8</td><td>Control-8</td><td>将关键词 8 应用到所选部分</td></tr><tr><td>应用关键词标记 9</td><td>Control-9</td><td>将关键词 9 应用到所选部分</td></tr><tr><td>清除所选范围</td><td>Option-X</td><td>清除范围选择</td></tr><tr><td>清除范围结尾</td><td>Option-O</td><td>清除范围的结束点</td></tr><tr><td>清除范围开头</td><td>Option-I</td><td>清除范围的开始点</td></tr><tr><td>删除标记</td><td>Control-M</td><td>删除选定的标记</td></tr><tr><td>删除选择中的标记</td><td>Control-Shift-M</td><td>删除选择中的所有标记</td></tr><tr><td>取消选择全部</td><td>Shift-Command-A</td><td>取消选择所有选定项目</td></tr><tr><td>个人收藏</td><td>F</td><td>将浏览器选择评分为个人收藏</td></tr><tr><td>个人收藏</td><td>Control-F</td><td>更改浏览器过滤器设置来显示个人收藏</td></tr><tr><td>隐藏被拒绝的项目</td><td>Control-H</td><td>更改浏览器过滤器设置来隐藏被拒绝的片段</td></tr><tr><td>新关键词精选</td><td>Shift-Command-K</td><td>创建新的关键词精选</td></tr><tr><td>新智能精选</td><td>Option-Command-N</td><td>创建新的智能精选</td></tr><tr><td>范围选择工具</td><td>R</td><td>将“范围选择”工具设为活跃</td></tr><tr><td>拒绝</td><td>删除</td><td>将浏览器中的当前所选部分标记为被拒绝的Note: 如果时间线而非浏览器处于活跃状态,则 Delete 键将移除所选项目。</td></tr><tr><td>已拒绝的</td><td>Control-Delete</td><td>更改浏览器过滤器设置来显示被拒绝的片段</td></tr><tr><td>从选择中移除所有关键词</td><td>Control-0</td><td>从浏览器选择中移除所有关键词</td></tr><tr><td>角色:应用对话角色</td><td>Control-Option-D</td><td>将对话角色应用到所选片段</td></tr><tr><td>角色:应用效果角色</td><td>Control-Option-E</td><td>将“效果”角色应用于选定的片段</td></tr><tr><td>角色:应用音乐角色</td><td>Control-Option-M</td><td>将“音乐”角色应用于选定的片段</td></tr><tr><td>角色:应用字幕角色</td><td>Control-Option-T</td><td>将“字幕”角色应用于选定的片段</td></tr><tr><td>角色:应用视频角色</td><td>Control-Option-V</td><td>将“视频”角色应用于选定的片段</td></tr><tr><td>全选</td><td>Command-A</td><td>选择所有片段</td></tr><tr><td>选择片段范围</td><td>X</td><td>将范围选择设定为与浏览条或播放头下方的片段边界匹配。</td></tr><tr><td>设定附加范围结尾</td><td>Shift-Command-O</td><td>在播放头或浏览条位置设定附加范围选择结束点</td></tr><tr><td>设定附加范围开头</td><td>Shift-Command-I</td><td>在播放头或浏览条位置设定附加范围选择起始点</td></tr><tr><td>设定范围结尾</td><td>O</td><td>设定范围的结束点</td></tr><tr><td>设定范围结尾</td><td>Control-O</td><td>编辑文本栏时设定范围的结束点</td></tr><tr><td>设定范围开头</td><td>I</td><td>设定范围的开始点</td></tr><tr><td>设定范围开头</td><td>Control-I</td><td>编辑文本栏时设定范围的开始点</td></tr><tr><td>取消评分</td><td>U</td><td>从选择中移除评分</td></tr></tbody></table><h3 id="整理"><a href="#整理" class="headerlink" title="整理"></a>整理</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>新事件</td><td>Option-N</td><td>创建新事件</td></tr><tr><td>新建文件夹</td><td>Shift-Command-N</td><td>创建新文件夹</td></tr><tr><td>在浏览器中显示</td><td>Shift-F</td><td>在浏览器中显示选定的片段</td></tr><tr><td>在浏览器中显示项目</td><td>Option-Shift-Command-F</td><td>在浏览器中显示打开的项目</td></tr><tr><td>同步片段</td><td>Option-Command-G</td><td>同步所选事件片段</td></tr></tbody></table><h3 id="回放-x2F-导航"><a href="#回放-x2F-导航" class="headerlink" title="回放/导航"></a>回放/导航</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>音频浏览</td><td>Shift-S</td><td>打开或关闭音频浏览</td></tr><tr><td>试演:预览</td><td>Control-Command-Y</td><td>在时间线的上下文中播放挑选项</td></tr><tr><td>片段浏览</td><td>Option-Command-S</td><td>打开或关闭片段浏览</td></tr><tr><td>仅剪切/切换多机位音频</td><td>Option-Shift-3</td><td>打开仅音频模式以进行多机位剪切和切换</td></tr><tr><td>剪切/切换多机位音频和视频</td><td>Option-Shift-1</td><td>打开音频/视频模式以进行多机位剪切和切换</td></tr><tr><td>仅剪切/切换多机位视频</td><td>Option-Shift-2</td><td>打开仅视频模式以进行多机位剪切和切换</td></tr><tr><td>向下</td><td>下箭头键</td><td>转至下一项(浏览器中)或下一个编辑点(时间线中)</td></tr><tr><td>向下</td><td>Control–下箭头键</td><td>编辑文本栏时,转至下一项(浏览器中)或下一个编辑点(时间线中)</td></tr><tr><td>后退 10 帧</td><td>Shift–左箭头键</td><td>将播放头向后移动 10 帧</td></tr><tr><td>前进 10 帧</td><td>Shift–右箭头键</td><td>将播放头向前移动 10 帧</td></tr><tr><td>跳到开头</td><td>个人按钮</td><td>将播放头移到时间线的开始处或浏览器中的第一个片段</td></tr><tr><td>跳到结尾</td><td>“结束”按钮</td><td>将播放头移到时间线的结尾处或浏览器中的最后一个片段</td></tr><tr><td>跳到下一个倾斜角度组</td><td>Option-Shift-撇号键 (’)</td><td>在当前的多机位片段中显示角度的下一个倾斜角度组</td></tr><tr><td>跳到下一个编辑点</td><td>撇号键 (’)</td><td>将播放头移到时间线中的下一个编辑点</td></tr><tr><td>跳到下一栏</td><td>Option–右箭头键</td><td>将播放头移到隔行扫描片段中的下一栏</td></tr><tr><td>跳到下一帧</td><td>右箭头键</td><td>将播放头移到下一帧</td></tr><tr><td>跳到下一子帧</td><td>Command–右箭头键</td><td>将播放头移到下一音频子帧</td></tr><tr><td>跳到上一个倾斜角度组</td><td>Option-Shift-分号键 (;)</td><td>在当前的多机位片段中显示角度的上一个倾斜角度组</td></tr><tr><td>跳到上一个编辑点</td><td>分号键 (;)</td><td>将播放头移到时间线中的上一个编辑点</td></tr><tr><td>跳到上一栏</td><td>Option–左箭头键</td><td>将播放头移到隔行扫描片段中的上一栏</td></tr><tr><td>跳到上一帧</td><td>左箭头键</td><td>将播放头移到上一帧</td></tr><tr><td>跳到上一子帧</td><td>Command–左箭头键</td><td>将播放头移到上一音频子帧</td></tr><tr><td>跳到范围结尾</td><td>Shift-O</td><td>将播放头移到范围选择的结束处。</td></tr><tr><td>跳到范围开头</td><td>Shift-I</td><td>将播放头移到范围选择的开始处。</td></tr><tr><td>循环回放</td><td>Command-L</td><td>打开或关闭循环回放</td></tr><tr><td>监视音频</td><td>Shift-A</td><td>打开或关闭要浏览的角度的音频监视</td></tr><tr><td>导航时间码输入</td><td>连字符键 (-)</td><td>输入负时间码值将向后移动播放头、向后移动片段或修剪范围或片段,具体取决于选择</td></tr><tr><td>下一个片段</td><td>Control–Command–右箭头键</td><td>转至下一项(浏览器中)或下一个编辑点(时间线中)</td></tr><tr><td>下一个标记</td><td>Control-撇号键 (’)</td><td>将播放头移到下一个标记</td></tr><tr><td>播放当前位置前后片段</td><td>Shift–问号键 (?)</td><td>在播放头位置周围播放</td></tr><tr><td>向前播放</td><td>L</td><td>向前播放(按下 L 键多次可增加回放速度)</td></tr><tr><td>从播放头播放</td><td>Option–空格键</td><td>从播放头位置播放</td></tr><tr><td>全屏幕播放</td><td>Shift-Command-F</td><td>从浏览条或播放头位置全屏幕播放</td></tr><tr><td>倒退播放</td><td>J</td><td>倒退播放(按下 J 键多次可增加倒退回放速度)</td></tr><tr><td>倒退播放</td><td>Control-J</td><td>编辑文本栏时倒退播放(按下 J 键多次可增加倒退回放速度)</td></tr><tr><td>倒退播放</td><td>Shift–空格键</td><td>倒退播放</td></tr><tr><td>播放所选部分</td><td>正斜杠键 (/)</td><td>播放选择</td></tr><tr><td>播放到结尾</td><td>Control-Shift-O</td><td>从播放头播放到选择结尾</td></tr><tr><td>播放/暂停</td><td>空格键</td><td>开始或暂停回放</td></tr><tr><td>播放/暂停</td><td>Control–空格键</td><td>编辑文本栏时开始或暂停回放</td></tr><tr><td>正时间码输入</td><td>等号键 (=)</td><td>输入正时间码值将向前移动播放头、向前移动片段或修剪范围或片段,具体取决于选择</td></tr><tr><td>上一个片段</td><td>Control–Command–左箭头键</td><td>转至上一项(浏览器中)或上一个编辑点(时间线中)</td></tr><tr><td>上一个标记</td><td>Control-分号键 (;)</td><td>将播放头移到上一个标记</td></tr><tr><td>设定监视角度</td><td>Shift-V</td><td>将要浏览的角度设定为监视角度</td></tr><tr><td>浏览</td><td>S</td><td>打开或关闭浏览</td></tr><tr><td>开始/停止画外音录制</td><td>Option-Shift-A</td><td>开始或停止使用“录制画外音”窗口来录制音频</td></tr><tr><td>停止</td><td>K</td><td>停止回放</td></tr><tr><td>停止</td><td>Control-K</td><td>编辑文本栏时停止回放</td></tr><tr><td>时间线历史记录后退</td><td>Command–左方括号 ([)</td><td>在时间线历史记录中后退一层</td></tr><tr><td>时间线历史记录前进</td><td>Command–右方括号 (])</td><td>在时间线历史记录中前进一层</td></tr><tr><td>向上</td><td>上箭头键</td><td>转至上一项(浏览器中)或上一个编辑点(时间线中)</td></tr><tr><td>向上</td><td>Control–上箭头键</td><td>编辑文本栏时,转至上一项(浏览器中)或上一个编辑点(时间线中)</td></tr></tbody></table><h3 id="共享和工具"><a href="#共享和工具" class="headerlink" title="共享和工具"></a>共享和工具</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>共享到默认目的位置</td><td>Command-E</td><td>使用默认目的位置共享选定的项目或片段</td></tr><tr><td>选择“箭头”工具</td><td>A</td><td>将“选择”工具设为活跃</td></tr><tr><td>切割工具</td><td>B</td><td>将“切割”工具设为活跃</td></tr><tr><td>裁剪工具</td><td>Shift-C</td><td>激活裁剪工具并显示所选片段或播放头下方最顶部片段的屏幕控制</td></tr><tr><td>变形工具</td><td>Option-D</td><td>激活变形工具并显示所选片段或播放头下方最顶部片段的屏幕控制</td></tr><tr><td>手工具</td><td>H</td><td>将“手”工具设为活跃</td></tr><tr><td>位置工具</td><td>P</td><td>将“位置”工具设为活跃</td></tr><tr><td>变换工具</td><td>Shift-T</td><td>激活变换工具并显示所选片段或播放头下方最顶部片段的屏幕控制</td></tr><tr><td>修剪工具</td><td>T</td><td>将“修剪”工具设为活跃</td></tr><tr><td>缩放工具</td><td>Z</td><td>将“缩放”工具设为活跃</td></tr></tbody></table><h3 id="显示"><a href="#显示" class="headerlink" title="显示"></a>显示</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>片段外观:仅片段标签</td><td>Control-Option-6</td><td>根据片段名称设置,显示仅带有片段名称、角色名称或活跃角度名称的时间线片段</td></tr><tr><td>片段外观:缩小波形大小</td><td>Control–Option–下箭头键</td><td>缩小时间线片段的音频波形大小</td></tr><tr><td>片段外观:仅连续画面</td><td>Control-Option-5</td><td>显示仅带有大型连续画面的时间线片段</td></tr><tr><td>片段外观:增大波形大小</td><td>Control–Option–上箭头键</td><td>增大时间线片段的音频波形大小</td></tr><tr><td>片段外观:大型连续画面</td><td>Control-Option-4</td><td>显示带有小型音频波形和大型连续画面的时间线片段</td></tr><tr><td>片段外观:大型波形</td><td>Control-Option-2</td><td>显示带有大型音频波形和小型连续画面的时间线片段</td></tr><tr><td>片段外观:波形和连续画面</td><td>Control-Option-3</td><td>显示带有等大的音频波形和视频连续画面的时间线片段</td></tr><tr><td>片段外观:仅波形</td><td>Control-Option-1</td><td>显示仅带有大型音频波形的时间线片段</td></tr><tr><td>减少片段高度</td><td>Shift-Command-连字符键 (-)</td><td>减少浏览器片段高度</td></tr><tr><td>增加片段高度</td><td>Shift–Command–等号键 (=)</td><td>增加浏览器片段高度</td></tr><tr><td>显示较少的连续画面帧</td><td>Shift-Command-逗号键 (,)</td><td>在浏览器片段中显示较少的连续画面帧</td></tr><tr><td>显示/隐藏音频动画</td><td>Control-A</td><td>显示或隐藏选定片段的音频动画编辑器</td></tr><tr><td>显示/隐藏浏览条信息</td><td>Control-Y</td><td>在浏览器中浏览时显示或隐藏片段信息</td></tr><tr><td>显示/隐藏视频动画</td><td>Control-V</td><td>显示或隐藏选定时间线片段的视频动画编辑器</td></tr><tr><td>显示较多的连续画面帧</td><td>Shift-Command-句点键 (.)</td><td>在浏览器片段中显示较多的连续画面帧</td></tr><tr><td>每个连续画面显示一帧</td><td>Option-Shift-Command-逗号键 (,)</td><td>每个连续画面显示一帧</td></tr><tr><td>查看片段名称</td><td>Option-Shift-N</td><td>在浏览器中显示或隐藏片段名称</td></tr><tr><td>将浏览器视为连续画面</td><td>Option-Command-1</td><td>将浏览器切换到连续画面视图</td></tr><tr><td>将浏览器视为列表</td><td>Option-Command-2</td><td>将浏览器切换到列表视图</td></tr><tr><td>放大</td><td>Command–等号键 (=)</td><td>放大时间线、浏览器或检视器</td></tr><tr><td>缩小</td><td>Command-连字符键 (-)</td><td>缩小时间线、浏览器或检视器</td></tr><tr><td>缩放至窗口大小</td><td>Shift-Z</td><td>将内容缩放为适合浏览器、检视器或时间线的大小</td></tr><tr><td>缩放到样本</td><td>Control-Z</td><td>打开或关闭放大音频样本</td></tr></tbody></table><h3 id="窗口"><a href="#窗口" class="headerlink" title="窗口"></a>窗口</h3><table><thead><tr><th>命令</th><th>快捷键</th><th>操作</th></tr></thead><tbody><tr><td>后台任务</td><td>Command-9</td><td>显示或隐藏“后台任务”窗口</td></tr><tr><td>前往“音频增强”</td><td>Command-8</td><td>将“音频增强”检查器设为活跃</td></tr><tr><td>前往颜色板</td><td>Command-6</td><td>将颜色板设为活跃</td></tr><tr><td>转至浏览器</td><td>Command-1</td><td>将浏览器设为活跃</td></tr><tr><td>转至检查器</td><td>Option-Command-4</td><td>将当前检查器设为活跃</td></tr><tr><td>转至时间线</td><td>Command-2</td><td>将时间线设为活跃</td></tr><tr><td>转至检视器</td><td>Command-3</td><td>将检视器设为活跃</td></tr><tr><td>下一个标签</td><td>Control-Tab</td><td>转至检查器或颜色板中的下一个面板</td></tr><tr><td>上一个标签</td><td>Control-Shift-Tab</td><td>转至检查器或颜色板中的上一个面板</td></tr><tr><td>录制画外音</td><td>Option-Command-8</td><td>显示或隐藏“录制画外音”窗口</td></tr><tr><td>显示直方图</td><td>Control-Command-H</td><td>在检视器中显示直方图</td></tr><tr><td>显示矢量显示器</td><td>Control-Command-V</td><td>在检视器中显示矢量显示器</td></tr><tr><td>显示视频波形</td><td>Control-Command-W</td><td>在检视器中显示波形监视器</td></tr><tr><td>显示/隐藏角度</td><td>Shift-Command-7</td><td>显示或隐藏角度检视器</td></tr><tr><td>显示/隐藏音频指示器</td><td>Shift-Command-8</td><td>显示或隐藏音频指示器</td></tr><tr><td>显示/隐藏浏览器</td><td>Control-Command-1</td><td>显示或隐藏浏览器</td></tr><tr><td>显示/隐藏效果浏览器</td><td>Command-5</td><td>显示或隐藏效果浏览器</td></tr><tr><td>显示/隐藏资源库列表</td><td>Shift-Command-1</td><td>显示或隐藏资源库列表</td></tr><tr><td>显示/隐藏事件检视器</td><td>Control-Command-3</td><td>显示或隐藏事件检视器</td></tr><tr><td>显示/隐藏检查器</td><td>Command-4</td><td>显示或隐藏“检查器”面板</td></tr><tr><td>显示/隐藏关键词编辑器</td><td>Command-K</td><td>显示或隐藏关键词编辑器</td></tr><tr><td>显示/隐藏时间线索引</td><td>Shift-Command-2</td><td>显示或隐藏打开项目的时间线索引</td></tr><tr><td>显示/隐藏视频观测仪</td><td>Command-7</td><td>在检视器中显示或隐藏视频观测仪</td></tr></tbody></table>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>FinalCutPro</tag>
<tag>视频剪辑</tag>
</tags>
</entry>
<entry>
<title>OpenWebRXPlus使用手册</title>
<link href="/2024/06/05/OpenWebRXPlus%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/"/>
<url>/2024/06/05/OpenWebRXPlus%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/</url>
<content type="html"><![CDATA[<blockquote><p>OpenWebRX是一款基于网络的软件定义无线电(SDR)接收器应用程序。它允许用户通过网页浏览器访问和控制连接的SDR硬件设备,用于无线电收听和监控。</p></blockquote><p>本文档是关于 <a href="https://luarvique.github.io/ppa/">OpenWebRX+</a> 的,它是基于 <a href="https://www.openwebrx.de/">OpenWebRX</a> 的改进和扩展版本 。由于原始项目缺少诸如降噪、调整步骤和对许多数字模式的支持等必要功能,**<a href="https://fms.komkon.org/">Marat Fayzullin</a>**决定分支OpenWebRX项目并添加他认为有必要、有趣或人们广泛要求的功能。</p><p>请注意,以下文档涵盖了<strong>原始</strong>OpenWebRX 和扩展版本的 OpenWebRX+。OpenWebRX+ 特有的功能已标记为如此。</p><h1 id="使用OpenWebRXPlus系统,请遵守你所在国家-x2F-地区的法律法规!!!"><a href="#使用OpenWebRXPlus系统,请遵守你所在国家-x2F-地区的法律法规!!!" class="headerlink" title="使用OpenWebRXPlus系统,请遵守你所在国家/地区的法律法规!!!"></a>使用OpenWebRXPlus系统,请遵守你所在国家/地区的法律法规!!!</h1><h1 id="本网页及文档内容仅供学习与技术交流,切勿用于非法用途。"><a href="#本网页及文档内容仅供学习与技术交流,切勿用于非法用途。" class="headerlink" title="本网页及文档内容仅供学习与技术交流,切勿用于非法用途。"></a><strong>本网页及文档内容仅供学习与技术交流,切勿用于非法用途。</strong></h1><p><a href="https://wap.miit.gov.cn/gyhxxhb/jgsj/cyzcyfgs/bmgz/wxdl/art/2024/art_9a2dba77d86942cebd1e9cbacd2d4b20.html">《中华人民共和国业余无线电台管理办法》</a></p><h1 id="相关链接:"><a href="#相关链接:" class="headerlink" title="相关链接:"></a>相关链接:</h1><p><a href="https://www.openwebrx.de/">https://www.openwebrx.de/</a></p><p><a href="https://fms.komkon.org/OWRX/">https://fms.komkon.org/OWRX/</a></p><p><a href="https://luarvique.github.io/ppa/">https://luarvique.github.io/ppa/</a></p><h1 id="如何安装-OpenWebRX"><a href="#如何安装-OpenWebRX" class="headerlink" title="如何安装 OpenWebRX+"></a><strong>如何安装 OpenWebRX+</strong></h1><h1 id="设备:"><a href="#设备:" class="headerlink" title="设备:"></a>设备:</h1><p>1.HackRF系列</p><p>2.RTL-SDR系列</p><p>3.SDRplay系列</p><p>4.Airspy系列</p><p>………</p><h3 id="OpenWebRX-包存储库"><a href="#OpenWebRX-包存储库" class="headerlink" title="OpenWebRX+ 包存储库"></a><a href="https://luarvique.github.io/ppa">OpenWebRX+ 包存储库</a></h3><p>支持Docker、树莓派、Ubuntu、Debian安装</p><p>这是 OpenWebRX Plus的软件包存储库。此版本的 OpenWebRX 提供以下新的和原始的功能:</p><ul><li>内置 FAX、SSTV、AIS、FLEX、POCSAG、ISM、RDS、CW、RTTY、SITOR-B 和 SAM 解码器。</li><li>内置 HFDL、VDL2、ADSB 和 ACARS 航空解码器。</li><li>内置 DTMF、EEA、EIA、CCIR 和多个 ZVEY SELCALL 解码器。</li><li>接收者用户之间的内置聊天。</li><li>内置 MP3 录音,用于录制接收音频。</li><li>内置扫描仪。</li><li>管理员能够查看用户连接并禁止用户滥用。</li><li>使用浏览器对接收到的图像进行后台 SSTV 和 FAX 解码。</li><li>基于谱减法的可调噪声过滤。</li><li>可调整的调谐步长。</li><li>自动生成短波广播的书签。</li><li>自动为附近的 业余无线电 中继器生成书签。</li><li>改进了触摸屏操作,具有平移和缩放功能。</li><li>改进的滚轮支持,具有调整和缩放功能。</li><li>改进了 CW 模式下的调谐。</li><li>带通滤波器可通过滚轮调节。</li><li>SDRPlay 设备操作更可靠。</li><li>地图显示了来自世界各地的其他在线SDR站点。</li><li>地图显示了来自世界各地的短波广播站。</li><li>地图显示航空解码器获得的飞机位置。</li><li>地图显示附近的 业余无线电 中继器。</li><li>更好的地图信息,包括距离、APRS 路径、天气等。</li><li>可配置会话超时,带有策略页面。</li><li>HTTPS 协议支持(需要 SSL 证书)。</li><li>可折叠接收器面板,具有可配置的不透明度。</li><li>频谱显示。</li></ul><p>该存储库包含适用于以下 Linux 发行版的软件包:</p><ul><li>适用于 amd64、arm64 架构的 Ubuntu 22.04 (Jammy Jellyfish)</li><li>适用于 amd64、arm64、armhf 架构的 Debian 11 (Bullseye)</li></ul><h3 id="树莓派安装"><a href="#树莓派安装" class="headerlink" title="树莓派安装"></a>树莓派安装</h3><p><a href="https://github.com/luarvique/openwebrx/releases/">Stanislav (LZ2SLL)</a>为树莓派 4构建了SD 卡镜像,其中包含纯净的 OpenWebRX+ 安装版本。该镜像支持大部分开箱即用的常见 SDR 设备。RTL-SDR 和 SDRPlay 设备无需对镜像进行任何额外修改即可工作。请记住,该镜像可能不是OpenWebRX+ 的最新版本。</p><p>请注意,此 SD 卡镜像不提供数字模式(DMR、NXDN 等)的软件支持,因为这些模式的软件解码器 (mbelib) 的来源有问题。为了在此镜像中启用数字模式,请通过 ssh 登陆并输入:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Plain">sudo install-softmbe.sh<br></code></pre></td></tr></table></figure><h3 id="Docker安装"><a href="#Docker安装" class="headerlink" title="Docker安装"></a>Docker安装</h3><p>Stanislav (LZ2SLL) 制作了两个 OpenWebRX+ Docker 镜像,可以在任何 x64 PC、arm32 或 arm64 设备 上运行。<a href="https://hub.docker.com/r/slechev/openwebrxplus-nightly">Nightly 版本</a>每天都会更新,并基于最新的 OpenWebRX+ 源。<a href="https://hub.docker.com/r/slechev/openwebrxplus">正式版</a> 基于最新发布的 OpenWebRX+ 软件包,与 Debian 上正常的 OpenWebRX+ 安装版本相同。正式版的镜像大小稍大一些,但也更稳定。</p><p>注意:安装Docker镜像前需要在宿主机添加设备黑名单,防止因内核占用导致容器无法调用SDR,完成后重启。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs Bash"><span class="hljs-built_in">cat</span> > /etc/modprobe.d/owrx-blacklist.conf << <span class="hljs-string">_EOF_</span><br><span class="hljs-string">blacklist dvb_usb_rtl28xxu</span><br><span class="hljs-string">blacklist sdr_msi3101</span><br><span class="hljs-string">blacklist msi001</span><br><span class="hljs-string">blacklist msi2500</span><br><span class="hljs-string">blacklist hackrf</span><br><span class="hljs-string">_EOF_</span><br></code></pre></td></tr></table></figure><p>拉取<a href="https://registry.hub.docker.com/r/slechev/openwebrxplus-softmbe/">slechev的Docker镜像</a>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Bash">docker pull slechev/openwebrxplus-softmbe<br></code></pre></td></tr></table></figure><p>宿主机创建存储目录:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs Bash"><span class="hljs-built_in">mkdir</span> /root/openwebrx/set<br><span class="hljs-built_in">mkdir</span> /root/openwebrx/etc<br></code></pre></td></tr></table></figure><p>开容器:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs Bash">docker run -d --name openwebrx \--device /dev/bus/usb \-p 8073:8073 \-v /root/openwebrx/set:/var/lib/openwebrx \-v /root/openwebrx/etc:/etc/openwebrx \--restart unless-stopped \<br>slechev/openwebrxplus-softmbe<br></code></pre></td></tr></table></figure><p>进入容器并创建admin管理账号:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Bash">docker <span class="hljs-built_in">exec</span> -it openwebrx admin adduser admin<br></code></pre></td></tr></table></figure><p>账号创建完成后就可以浏览器访问“IP:8073”打开页面了(如需外网访问请自行申请公网IP或者搭建内网穿透,并使用强壮密码,请勿随意分享自己的站点,更不要触及敏感波段,切记!!!),浏览守听无需登录,需要对站点进行自定义时点击右上角的“Settings”使用刚才创建的账号登录修改。</p><h4 id="避坑指南"><a href="#避坑指南" class="headerlink" title="避坑指南"></a>避坑指南</h4><p>OpenWebRX+可能会出现FT8无法解码的情况</p><p>解决办法(x86平台):</p><p>进入容器:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Bash">docker <span class="hljs-built_in">exec</span> -it openwebrx /bin/sh<br></code></pre></td></tr></table></figure><p>执行如下命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs Bash">apt update<br>apt install binutils<br>strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5<br></code></pre></td></tr></table></figure><h3 id="升级-OpenWebRX"><a href="#升级-OpenWebRX" class="headerlink" title="升级 OpenWebRX+"></a>升级 OpenWebRX+</h3><p>要从旧的 OpenWebRX+ 版本升级,请以 root 身份执行以下操作:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">apt update<br>apt upgrade<br></code></pre></td></tr></table></figure><h3 id="Ubuntu安装"><a href="#Ubuntu安装" class="headerlink" title="Ubuntu安装"></a>Ubuntu安装</h3><p>将此存储库添加到您的Ubuntu系统,请以 root 身份执行以下操作:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">wget -O - https://luarvique.github.io/ppa/openwebrx-plus.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/openwebrx-plus.gpg<br>echo "deb [signed-by=/etc/apt/trusted.gpg.d/openwebrx-plus.gpg] https://luarvique.github.io/ppa/ubuntu ./" > /etc/apt/sources.list.d/openwebrx-plus.list<br>apt update<br></code></pre></td></tr></table></figure><p>然后添加OpenWebRX 存储库,因为它包含一些必要的包。为了将OpenWebRX 存储库添加到您的Ubuntu系统,请以 root 身份执行以下操作:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">wget -O - https://repo.openwebrx.de/debian/key.gpg.txt | gpg --dearmor -o /usr/share/keyrings/openwebrx.gpg<br>echo "deb [signed-by=/usr/share/keyrings/openwebrx.gpg] https://repo.openwebrx.de/ubuntu/ jammy main" > /etc/apt/sources.list.d/openwebrx.list<br>apt update<br></code></pre></td></tr></table></figure><h3 id="Debian安装"><a href="#Debian安装" class="headerlink" title="Debian安装"></a>Debian安装</h3><p>为了将此存储库添加到您的Debian Bullseye系统,请以 root 身份执行以下操作:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">wget -O - https://luarvique.github.io/ppa/openwebrx-plus.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/openwebrx-plus.gpg<br>echo "deb [signed-by=/etc/apt/trusted.gpg.d/openwebrx-plus.gpg] https://luarvique.github.io/ppa/debian ./" > /etc/apt/sources.list.d/openwebrx-plus.list<br>apt update<br></code></pre></td></tr></table></figure><p>添加OpenWebRX 存储库,因为它包含一些必要的包。为了将OpenWebRX 存储库添加到您的Debian Bullseye系统,请以 root 身份执行以下操作:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">wget -O - https://repo.openwebrx.de/debian/key.gpg.txt | gpg --dearmor -o /usr/share/keyrings/openwebrx.gpg<br>echo "deb [signed-by=/usr/share/keyrings/openwebrx.gpg] https://repo.openwebrx.de/debian/ bullseye main" > /etc/apt/sources.list.d/openwebrx.list<br>apt update<br></code></pre></td></tr></table></figure><p>如果您有Debian Bookworm系统,现在有一个实验性的 OpenWebRX+ 版本可供您使用。以 root 身份执行以下操作:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">wget -O - https://luarvique.github.io/ppa/openwebrx-plus.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/openwebrx-plus.gpg<br>echo "deb [signed-by=/etc/apt/trusted.gpg.d/openwebrx-plus.gpg] https://luarvique.github.io/ppa/bookworm ./" > /etc/apt/sources.list.d/openwebrx-plus.list<br>apt update<br></code></pre></td></tr></table></figure><p>Debian Bookworm用户不能将OpenWebRX 存储库添加到他们的系统中,因为它包含 Bullseye 软件包。</p><p>添加好存储库后 请以 root 身份执行以下操作:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">apt install openwebrx<br></code></pre></td></tr></table></figure><p>要确保 OpenWebRX+ 正在运行,请在本地网页浏览器输入以下地址:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">http://localhost:8073/<br></code></pre></td></tr></table></figure><p>您应该会看到 OpenWebRX+ Web 界面,其中包含噪声滤波器 (NR) 和调谐步长 (>-<) 控件。</p><h3 id="SDRPlay-设备或其克隆设备"><a href="#SDRPlay-设备或其克隆设备" class="headerlink" title="SDRPlay 设备或其克隆设备"></a>SDRPlay 设备或其克隆设备</h3><p>此存储库提供了改进的 SoapySDRPlay3 设备驱动程序,与原始版本相比有以下更改:</p><ul><li>修复了通用增益控制,将其限制为 IFGR 设置。</li><li>让 RFGR 设置一个名为“rf_gain”的单独的可选参数。</li><li>固定频率校正 (ppm) 参数。</li><li>修复了从 LIF 切换到宽带 ZIF 模式时的问题。</li><li>修复了将设置发送到设备时的死锁。</li><li>添加了当设备不接受设置时的多次重试。</li><li>稍微加宽滤波器,减少大多数带宽的“驼峰”大小。</li><li>添加了 1.536MHz 带宽。</li></ul><p>为了安装改进的 SoapySDRPlay3 软件包,请以 root 身份执行以下操作:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">apt install soapysdr-module-sdrplay3<br></code></pre></td></tr></table></figure><p>在安装过程中,SoapySDRPlay3 软件包还应安装最新的 SoapySDR 并从 /usr/local 中删除所有本地构建的 SoapySDR 文件。您仍然需要从此页面下载并安装 SDRPlay API:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">https://www.sdrplay.com/downloads/<br></code></pre></td></tr></table></figure><p>SDRPlay API 也可以按照以下说明作为非官方包安装:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs Plaintext">https://gitlab.com/martin.herren/libsdrplay-api<br></code></pre></td></tr></table></figure><p>安装部分内容来自:<a href="https://luarvique.github.io/ppa">https://luarvique.github.io/ppa</a></p><h1 id="如何使用-OpenWebRX"><a href="#如何使用-OpenWebRX" class="headerlink" title="如何使用 OpenWebRX+"></a><strong>如何使用 OpenWebRX+</strong></h1><h2 id="入门"><a href="#入门" class="headerlink" title="入门"></a><strong>入门</strong></h2><p>在本节中,我们将讨论如何开始使用 OpenWebRX+、用户界面中显示的内容以及控件如何工作。</p><h3 id="主页面"><a href="#主页面" class="headerlink" title="主页面"></a><strong>主页面</strong></h3><p><img src="https://huangetech.feishu.cn/space/api/box/stream/download/asynccode/?code=NDQzNDE5MTY4ZjBlNzE0YThmNmUyYjJkYzA4NDNkNmJfM3Z3SW84Rzh1U3FUcG9wYUduRkdVM3k0amVhN0FieFhfVG9rZW46V2hVT2JpQ0dIb0lRWVl4Zm9YRmNKQnhBbkNiXzE3MTc1Njg4NjM6MTcxNzU3MjQ2M19WNA" alt="img"></p><ol><li><strong>滚动瀑布</strong> 显示您当前选择的 SDR 配置文件中的频段活动。瀑布颜色代表每个频率的信号水平,较亮的颜色对应较强的信号。因此,一个强烈、良好、持续的信号看起来就像瀑布上一条明亮的垂直条纹。不同的信号调制产生不同形状的条纹。 有关示例, 请参阅 <a href="https://www.sigidwiki.com/wiki/Signal_Identification_Guide">信号识别指南。</a></li><li>频率<strong>刻度</strong>显示实际频率以及当前调谐的频率,用黄色插入符号表示。<strong>这是您当前正在收听的</strong>频率。插入符号两侧的数字代表当前过滤器范围。您可以通过拖动插入符号两侧来更改这些边界。</li><li>OpenWebRX+ 中的频谱显示显示 每个<strong>频率的当前</strong>信号电平,而不是瀑布显示的历史电平。频谱显示有一点延迟,来确保短信号仍然在频谱上留下痕迹。</li><li>步进<strong>调谐按钮</strong>可让您通过左键单击来上下调整频率范围。启用“侧步”功能后,您还可以右键单击这些按钮以跳出当前选择的配置文件。</li><li>书签可让您快速调至之前添加书签的频率<strong>。</strong>OpenWebRX 中有三种类型的书签:<ol><li><strong>绿色</strong>书签代表频段规划定义的频率。除了修改频段计划之外,这些书签不可编辑。</li><li><strong>黄色</strong>书签保存在OpenWebRX服务器上,可由管理员编辑。</li><li><strong>蓝色</strong>书签保存在您的网络浏览器中,因此您可以创建和编辑。</li></ol></li><li>单击页面左上角的图标即可显示 接收者<strong>信息。</strong>该信息由管理员填写,包括接收者的姓名、位置和硬件描述。</li><li><strong>状态</strong> 按钮可切换接收器网页底部显示的 <strong>状态栏。</strong></li><li>聊天按钮可切换接收者网页底部显示的<strong>日志和聊天面板。</strong>如果管理员选择禁用聊天功能,此按钮将变成<strong>“日志”</strong>,打开非交互式日志面板。</li><li>接收<strong>器</strong>按钮可切换接收器的 <strong>主控制面板。</strong></li><li>“<strong>地图”</strong>按钮可打开<strong>地图页面</strong> ,显示广播电台、中继器、其他在线SDR站点以及来自各种来源(例如飞机、船舶和 业余无线电操作员)的位置报告。</li><li>“<strong>文件”</strong>按钮可打开<strong>文件浏览器页面</strong>,其中包含最近接收的 SSTV 图像、传真和其他数据。</li><li>设置<strong>按钮</strong>可打开受密码保护的<strong>设置页面</strong>以配置 OpenWebRX+。通常,只有服务器管理员需要访问服务器设置。</li><li>页面底部的状态栏显示服务器的当前状态及其与网络浏览器的 连接<strong>。</strong>各种面板显示网络吞吐量、服务器CPU负载和温度、音频采样率等。</li></ol><h3 id="主要控制装置"><a href="#主要控制装置" class="headerlink" title="主要控制装置"></a><strong>主要控制装置</strong></h3><p><img src="https://huangetech.feishu.cn/space/api/box/stream/download/asynccode/?code=Mjg3NWFkMWVhMjk2YjY1Zjc0MDczNWNkMzk4YjhhYjNfbXU3VkR5S1hXZWQ1akhCcDhjdTZaZ2xPbXBueTF1RzFfVG9rZW46TThwZ2JaaHdPb0o2ZFJ4UWFDYWNIbzlIbmtiXzE3MTc1Njg4NjM6MTcxNzU3MjQ2M19WNA" alt="img"></p><ol><li>这是接收器<strong>当前调谐的频率。</strong>您可以通过单击瀑布、书签或直接在此字段中输入来更改它。<strong>频率只能在当前配置文件范围内更改。</strong></li><li>单击此按钮可为您当前的频率<strong>添加书签</strong>。新书签将本地存储在您的浏览器中,并在瀑布上方显示为蓝色标记。</li><li>这是<strong>当前配置文件</strong>,包括 SDR 设备名称(“RSPdx”)。OpenWebRX 支持多个 SDR 设备,每个设备都有多个配置文件。选择新配置文件时,请记住,<strong>同一 SDR 设备的所有用户的配置文件</strong>都会发生变化,因此当您看到其他人使用该服务器时,请务必小心。</li><li><strong>这是所有可用音频调制模式</strong> 的列表,当前模式以黄色突出显示。通过单击相应按钮选择新模式,但请记住,并非所有模式都适用。它有助于了解每个调制在瀑布上的样子。 如果不确定, 请参阅 <a href="https://www.sigidwiki.com/wiki/Signal_Identification_Guide">信号识别指南。</a></li><li><strong>如果数字解码器处于活动状态</strong> ,该按钮将会亮起。单击它可关闭数字解码。</li><li>这是<strong>当前的数字解码模式</strong>(如果处于活动状态)。您可以从此处的列表中选择新的数字解码模式,但请记住,并非所有模式都适用。它有助于了解每种数字模式在瀑布上的样子。 如果不确定, 请参阅 <a href="https://www.sigidwiki.com/wiki/Signal_Identification_Guide">信号识别指南。</a></li><li>使用此滑块控制<strong>音频音量</strong>。单击扬声器按钮可将音频静音或取消静音。</li><li>使用此滑块设置<strong>静噪阈值</strong>。左键单击 <strong>SQ</strong>按钮可打开和关闭静噪。当静噪打开时,任何低于所选静噪阈值的音频都将被静音。</li><li>右键单击<strong>SQ</strong>按钮可切换频率扫描仪,使<strong>SQ</strong>按钮呈绿色亮起。扫描仪将自动检查所有已标记的频率以查找高于静噪阈值的信号并调谐到它们。一旦信号消失,扫描仪将继续检查书签以获取更多信号。</li><li>使用此滑块设置<strong>降噪阈值</strong>。单击 <strong>NR</strong>按钮可打开和关闭降噪功能。降噪算法基于谱减法原理。它将从音频中删除任何低于所选阈值的频率,从而减少背景噪音。请记住,过度使用降噪可能会扭曲或抑制有用的声音。</li><li><strong>调谐步长</strong>选择 器允许您选择频率调谐粒度。例如,如果选择 1kHz 步进,则频率将始终以 1kHz 增量进行调谐。不同的配置文件可能采用不同的默认调谐步骤,例如短波广播公司的 5kHz 或使用 SSB 调制的 HAM 运营商的 500Hz。单击相邻按钮可将当前配置文件的调整步长重置为其默认值。</li><li><strong>此滑块设置“最热”瀑布颜色</strong>(通常为红色) 的信号级别。当查看强信号时将其设置得较高,当查看弱信号时将其设置得较低。</li><li>左键单击相邻按钮可一次性自动调整瀑布颜色。右键单击按钮可切换瀑布颜色的连续自动调整。</li><li><strong>此滑块设置“最冷”瀑布颜色</strong>(通常为蓝色) 的信号级别。当查看强信号时将其设置得较高,当查看弱信号时将其设置得较低。</li><li>左键单击相邻按钮可将瀑布颜色重置为其默认值。</li><li>此下拉列表允许您选择<strong>用户界面主题</strong>之一。单击相邻按钮会将用户界面重置为默认主题。</li><li>该滑块控制<strong>用户界面的不透明度</strong>,使瀑布顶部的面板或多或少可见。单击相邻按钮将用户界面重置为完全不透明度。</li><li>四个缩放按钮可让您放大和<strong>缩小瀑布</strong>。缩放始终围绕当前调谐频率进行,并保持显示。</li><li>主面板底部的时钟显示**当前的通用协调时间 (UTC)**。大多数 OpenWebRX 用户界面都以 UTC 运行,因此显示此时钟是为了更方便参考。</li><li>单击<strong>“录制”</strong>按钮可随时开始<strong>录制音频。</strong>该按钮将呈红色亮起,表示正在进行录制。再次单击<strong>REC</strong>按钮后,它将停止录制并将录制的音频保存到文件中。</li><li>底部的条指示<strong>当前信号电平</strong>。它将根据 OpenWebRX 认为信号过载的情况改变颜色。还有一个数字读数,以分贝为单位显示精确值。</li><li>此按钮可切换瀑布上方的<strong>实时频谱显示。</strong>使用它时,请记住频谱显示可能会使您的网络浏览器使用大量处理器能力。</li></ol><h3 id="使用鼠标和触摸"><a href="#使用鼠标和触摸" class="headerlink" title="使用鼠标和触摸"></a><strong>使用鼠标和触摸</strong></h3><p>OpenWebRX 需要使用鼠标右键。<strong>在具有单个鼠标按钮的设备(例如 Apple 计算机)上,通过按住CONTROL</strong> 键并单击鼠标 来模拟鼠标右键。</p><p><strong>在基于触摸的设备</strong>(例如智能手机和平板电脑)上,通过用手指按住该位置比不常用的时间长一点来模拟鼠标右键。</p><p>鼠标<strong>滚轮</strong>有两种操作模式:<strong>正常</strong>模式和 <strong>修改</strong>模式(按下鼠标右键、滚轮按钮或 SHIFT 键):</p><ul><li><strong>在瀑布中:</strong> 正常的轮子旋转调整频率,修改后的轮子旋转改变缩放系数。可以通过接收器面板中的复选框来逆转此行为。</li><li><strong>在频率范围内:</strong> 正常和修改的车轮旋转都会调整频率。</li><li><strong>在带通滤波器(黄色插入符号)处:</strong> 正常轮旋转使滤波器向左或向右移动,修改后的轮旋转使滤波器更宽或更窄。</li></ul><h2 id="使用场景"><a href="#使用场景" class="headerlink" title="使用场景"></a><strong>使用场景</strong></h2><p>在本节中,我们将介绍一些可以使用 OpenWebRX 进行的常见操作,例如收听广播电台、HAM 操作员以及跟踪船舶和飞机。</p><h3 id="收听-FM-广播"><a href="#收听-FM-广播" class="headerlink" title="收听 FM 广播"></a><strong>收听 FM 广播</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/FM_broadcasting">什么是调频广播?</a></em></p><p>FM广播一般发生在76MHz到108MHz之间。每个广播公司都分配有 100kHz 的频谱,除非它们位于美国,每个电台分配有 200kHz 的频谱。FM 广播的传输距离可达 100 公里,但受地平线限制。如果您居住在美国,可以通过 <a href="https://radio-locator.com/">Radio Locator</a> 网站找到最近的 FM 电台。</p><p>为了在 OpenWebRX 中收听 FM 广播,请选择包含上述频率的配置文件,按接收器面板上的<strong>WFM</strong> 按钮,然后调谐到其中一个信号。请注意,OpenWebRX 仅播放<strong>单声道声音</strong>,因此不会有任何立体声。</p><p>OpenWebRX+ 还允许<strong>解码 FM 广播中发送的文本 RDS 信息</strong>,例如电台名称、节目名称和类型等。要查看此信息,请调谐到 FM 信号并选择 <em>“RDS”</em>数字模式。您应该会在瀑布底部看到 RDS 信息面板,其中慢慢充满了数据。</p><p>由于<strong>RDS 数据在美国的编码方式</strong>与欧洲略有不同,您可能需要转到<em>“设置 | 解调和解码 | 其他”</em>并更改<em>“从 WFM 广播中解码美国特定的 RDS 信息”</em>选项以反映您的接收器位置。</p><h3 id="收听-AM-广播"><a href="#收听-AM-广播" class="headerlink" title="收听 AM 广播"></a><strong>收听 AM 广播</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/AM_broadcasting">什么是 AM 广播?</a></em></p><p>人们所说的“AM”通常是指在 LW 和 MW 频段(100kHz 至 1800kHz 之间)发生的无线电广播。每个电台分配有 10kHz 的频谱。白天,AM广播的距离可达200公里,但这个距离在夜间会大大增加。如果您居住在美国,可以通过 <a href="https://radio-locator.com/">Radio Locator</a> 网站找到最近的 AM 电台。</p><p>为了在 OpenWebRX 中收听 AM 广播,请选择包含上述频率的配置文件,按接收器面板上的<strong>AM</strong> 按钮,然后调谐到其中一个信号。如果您感兴趣的信号被相邻信号遮挡,请尝试使用<strong>SAM</strong>按钮。<strong>它与AM</strong>具有相同的效果,但使用了更抗干扰的不同算法。</p><h3 id="短波收听-SWL"><a href="#短波收听-SWL" class="headerlink" title="短波收听 (SWL)"></a><strong>短波收听 (SWL)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Shortwave_listening">什么是SWL?</a></em></p><p>“短波”描述了 无线电广播公司、业余爱好者和专业人士使用的 1800kHz 至 30MHz 之间的<a href="https://en.wikipedia.org/wiki/Shortwave_bands">多个频段。</a>SWL 活动通常指的是短波广播收听,广播公司可以使用 AM 调制轻松覆盖数千公里。<a href="https://short-wave.info/">全球短波广播时间表可在Shortwave Info</a>和 <a href="https://shortwaveschedule.com/">Shortwave Schedule</a>网站上找到 。</p><p>要在 OpenWebRX 中收听短波广播,请选择包含您感兴趣的短波频段的配置文件,按 接收器面板上的<strong>AM</strong>按钮,然后调谐到其中一个信号。如果信号被相邻信号遮挡,请尝试使用<strong>SAM</strong>按钮。<strong>它与AM</strong>具有相同的效果,但使用了更抗干扰的不同算法。</p><p>OpenWebRX+每天一次<strong>查询</strong> <strong><a href="http://www.eibispace.de/">EiBi</a></strong> <strong>数据库以获取短波广播时间表</strong>。当前广播电台在地图上用<strong>⍑</strong>标记表示。单击某个电台会显示其时间表,包括频率和广播时间。OpenWebRX+ 将调谐到点击的频率,只要它们在 您正在收听的 <strong>配置文件内。</strong></p><p>您可以通过*“设置 | 常规 | 显示 | 短波书签范围”设置距接收器的最大范围,让 OpenWebRX+*<strong>为当前广播的短波电台</strong> 创建书签。OpenWebRX+ 只会为位于该范围内的短波电台创建书签。</p><p>您还可以<strong>将短波书签限制为几个配置文件</strong> (例如 49m / 41m / 等):</p><ol><li><em>通过将“设置|常规|显示|短波书签范围”</em>设置为零来 禁用全局短波书签。</li><li>转到<em>“设置 | SDR 设备和配置文件 | <设备> | <配置文件>”</em> ,然后单击<strong>“添加”添加名为</strong><em>“Shortwave 书签范围”</em>的选项。</li><li>将新添加的选项设置为距接收器的最大范围,您希望在其中查看短波书签并通过单击“<strong>应用”和“保存”</strong>保存配置文件设置。</li></ol><p>需要注意的是,只有在 <em>“设置|常规|接收器信息|接收器位置”中</em><strong>设置正确的接收器位置,</strong>短波电台才会正确显示。同样重要的是要记住,由于 OpenWebRX+ 每天查询<a href="http://www.eibispace.de/">EiBi</a>一次,因此在设置接收器位置后 <strong>可能无法立即获得最新信息。</strong></p><h3 id="聆听公民波段-CB"><a href="#聆听公民波段-CB" class="headerlink" title="聆听公民波段 (CB)"></a><strong>聆听公民波段 (CB)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Citizens_band_radio">什么是CB?</a></em></p><p>公民频段 (CB) 通常覆盖 27MHz 到 28MHz 之间的频谱,个人只要遵守一些规则就可以在没有许可证的情况下进行通信。CB 频段的确切范围因国家/地区而异。它毗邻 10m 业余频段。</p><p>在大多数地方,CB 频段分为 40 个通道(CB1 至 CB40),间隔为 10kHz。OpenWebRX+ 为这些频道提供默认书签。虽然 CB 最初允许所有模拟语音模式(AM、FM、LSB、USB),但美国用户通常更喜欢较低通道的 AM 和较高通道的 LSB。在英国,AM 直到最近才被禁止,FM 是最常见的 CB 模式。</p><p>为了在 OpenWebRX 中收听 CB,请选择包含 CB 频段的配置文件,并通过单击瀑布或书签来调谐到其中一个信号。然后,您可能需要按 接收器面板上的 <strong>AM</strong>、<strong>FM</strong>、 <strong>LSB</strong>或<strong>USB按钮,具体取决于您正在收听的传输所使用的调制类型。</strong></p><h3 id="聆听-业余无线电短波电台"><a href="#聆听-业余无线电短波电台" class="headerlink" title="聆听 业余无线电短波电台"></a><strong>聆听 业余无线电短波电台</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Amateur_radio_operator">什么是火腿?</a></em></p><p>业余无线电操作员 (HAM) 的工作频率为 160m、80m、40m、20m 和其他一些 <a href="https://en.wikipedia.org/wiki/Shortwave_bands">短波频段</a>。从莫尔斯电码到语音,再到数字传输,各种活动都发生在这些频段上。</p><p>每个业余无线电通常分为三个部分:</p><ul><li>底部用于莫尔斯电码传输,也称为“电报”或CW。</li><li>在摩尔斯电码的正上方,有一堆不同格式的数字传输,例如 RTTY、FT8、FT4 等。其中许多格式以固定频率运行,这些频率包含在 OpenWebRX 频段规划中,因此显示为绿色书签。</li><li>频带的其余部分分配给使用 LSB 或 USB 调制的语音(或“电话”)传输,并加入一些 AM。LSB 调制用于 20m 以下,而 USB 用于 20m 及以上。</li></ul><p>为了在 OpenWebRX 中收听业余无线电操作员的广播,请选择包含您感兴趣的 HAM 频段的配置文件,按下 接收器面板上的<strong>LSB</strong>或<strong>USB</strong> 按钮,然后调谐到其中一个信号。虽然大多数业余传输发生在 1kHz 边界,但您可能需要更精确地调谐以获得更清晰的声音。</p><h3 id="收听摩尔斯电码-CW"><a href="#收听摩尔斯电码-CW" class="headerlink" title="收听摩尔斯电码 (CW)"></a><strong>收听摩尔斯电码 (CW)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Continuous_wave">什么是CW?</a></em></p><p>大多数摩尔斯电码 (CW) 传输发生在业余无线电频段的低端,例如 3500-3600kHz、7000-7100kHz、14000-14100kHz 等。要在 OpenWebRX 中启用 CW 模式,请按 接收器面板上的<strong>CW按钮。</strong>在此模式下,带通滤波器缩小至 700-900Hz 范围,以获得更好的选择性。此外,在 CW 模式下,OpenWebRX+ 会将频率调至<strong>低于单击的载波频率 800Hz</strong>,以确保始终听到载波。</p><p>对于那些不懂莫尔斯电码的人,OpenWebRX+ 提供 <strong>自动 CW 解码</strong>,可通过选择<em>“CW 解码器”</em>数字模式来启用。CW 解码器向您呈现一个缩放的二级瀑布,其中可能包含多个 CW 信号。一旦您点击您感兴趣的 CW 信号,解码后的文本将显示在二级瀑布下方,其中无法识别的字符显示为下划线。</p><p>您还可以使 CW 解码器显示 正在解码的<strong>原始“嘀”和“哒” 。</strong>为此,请转至<em>“设置 | 解调和解码 | 其他”</em>并启用<em>“解码 CW 时显示 CW 代码(dits / dahs)”</em>选项。</p><h3 id="接收电传打字机-RTTY"><a href="#接收电传打字机-RTTY" class="headerlink" title="接收电传打字机 (RTTY)"></a><strong>接收电传打字机 (RTTY)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/RTTY">RTTY是什么?</a></em></p><p>电传打字机传输由两个载波信号组成,其中一个信号指定“空格”(或零),而另一个信号指定“标记”(或一个)。连续五位组成一个字符,用博多码编码。因此,描述 RTTY 传输的三个重要参数:</p><ul><li><strong>带宽 (Hz)</strong> 这是两个载波信号之间的距离,以赫兹为单位。常见带宽为 85Hz、170Hz、450Hz 和 650Hz。</li><li><strong>比特率(波特率)</strong> 这是传输速度,决定每秒发送多少位。常见的比特率有 45bd、45.45bd、50bd、75bd 和 100bd。</li><li><strong>反向</strong> “反向”选项在应用时会翻转“空间”和“标记”频率的含义。</li></ul><p>OpenWebRX+ 附带三种不同的 RTTY 设置,可通过数字模式下拉列表进行选择:</p><ul><li><strong>RTTY-170 (45)</strong> 这是HAM运营商常用的模式,带宽170Hz,码率45bd。您可以在大多数 HAM HF 频段上找到此模式下的传输,其传输略高于莫尔斯电码传输。</li><li><strong>RTTY-450 (50N)</strong> 此模式由德国气象服务使用,最常见于 10100kHz 频率。OpenWebRX+ 包含此频率和其他德国天气 RTTY 频率的默认(黄色)书签。此模式使用 450Hz 带宽和 50bd 比特率,“标记”和“空间”频率相反。</li><li><strong>RTTY-85 (50N)</strong> 此模式通常用于可用带宽有限的 LF 和 VLF 频段。它具有 85Hz 带宽和 50bd 比特率,“标记”和“空间”频率相反。</li></ul><p>为了在 OpenWebRX+ 中接收电传打字机传输,请按 接收器面板上的<strong>USB</strong>按钮并调谐到 RTTY 传输,它看起来像两个靠近在一起的信号。然后选择上述 RTTY 解码器之一。它将向您呈现一个缩放的二级瀑布,其中可能包含多个 RTTY 信号。单击您感兴趣的 RTTY 信号后,解码后的文本将显示在二级瀑布下方,其中无法识别的字符显示为下划线。</p><h3 id="接收-SSTV-图像"><a href="#接收-SSTV-图像" class="headerlink" title="接收 SSTV 图像"></a><strong>接收 SSTV 图像</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/SSTV">什么是SSTV?</a></em></p><p>慢扫描电视 (SSTV) 协议允许业余无线电爱好者通过电波交换小型静态图像。大多数 SSTV 频率都列在 OpenWebRX+ 频段计划中,因此将显示为绿色书签。为了在 OpenWebRX+ 中可靠地接收 SSTV 图像,请执行以下操作:</p><ol><li>选择<em>“SSTV”</em>数字模式并<strong>精确</strong>调谐到 SSTV 载波频率以下 1900Hz,或使用任何提供的 SSTV 书签。</li><li>等待下一次 SSTV 传输开始。OpenWebRX+<strong>将不会</strong> 接收部分 SSTV 传输,因为它需要从传输标头获取图像格式信息。</li><li>接收到的 SSTV 图像将显示在瀑布显示屏顶部的单独面板中。单击图像将其下载到您的计算机或移动设备。</li></ol><p>OpenWebRX+ 目前支持的唯一 SSTV 格式是 Robot36、Robot72、Martin1、Martin2、Scottie1、Scottie2 和 ScottieDX。其他 SSTV 格式(包括数字 SSTV)将不会被接收。</p><h3 id="接收传真图像"><a href="#接收传真图像" class="headerlink" title="接收传真图像"></a><strong>接收传真图像</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Radiofax">什么是无线传真?</a></em></p><p>如今,高频无线电传真协议主要用于向海上船只广播气象图和相关信息。美国国家气象局定期发布 <a href="https://www.weather.gov/media/marine/rfax.pdf">天气传真时间表,</a> 您可以使用它来收听附近的传真广播。此外,OpenWebRX+ 还为大多数已知的天气传真频率提供默认(黄色)书签。为了在 OpenWebRX+ 中可靠地接收传真,请执行以下操作:</p><ol><li>选择<em>“传真”</em>数字模式并<strong>精确</strong>调谐到低于传真载波频率 1900Hz,或使用任何提供的传真书签。</li><li>等待下一次传真传输开始。OpenWebRX+<strong>将不会</strong> 接收部分传真传输,因为它需要从传输标头获取图像格式信息。</li><li>收到的传真图像将显示在瀑布显示屏顶部的单独面板中。单击图像将其下载到您的计算机或移动设备。</li></ol><p>OpenWebRX+ 内部的传真解码器支持<strong>IOC576 和 IOC288 格式的 120LPM 传输</strong>。作为<strong>管理员</strong>,您对传真解码有一定的控制权。<em>“设置|常规|解调和解码|传真传输”</em>中提供以下选项 :</p><ul><li><strong>传输速度</strong> 传输速度控制解码器期望的每分钟传真线路数。最常见的值为 120LPM。除非您完全确定需要不同的版本,否则请勿更改它。</li><li><strong>对接收到的图像进行后处理以减少噪音</strong> 启用后,此选项使传真解码器对接收到的图像进行后处理以获得更好的对比度。但某些灰度梯度可能会因此丢失。</li><li><strong>接收彩色图像</strong> 此实验选项应允许 OpenWebRX+ 接收彩色传真。但由于缺乏样本,尚未进行测试。</li><li><strong>使用幅度调制</strong> 此实验性选项允许 OpenWebRX+ 接收使用 AM 模式编码的传真,而不是通常的 USB。目前,由于缺乏样本,尚未进行测试。</li></ul><h3 id="监控寻呼机消息-POCSAG"><a href="#监控寻呼机消息-POCSAG" class="headerlink" title="监控寻呼机消息 (POCSAG)"></a><strong>监控寻呼机消息 (POCSAG)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Pager">什么是寻呼机?</a></em></p><p>虽然无线寻呼机基本上是一种过时的技术,但它仍在医院、企业中使用,并用于自动报告。寻呼机流量通常出现在 150-165MHz 以及其他 VHF 和 UHF 频段。OpenWebRX+ 可以以不同的速度解码 <a href="https://en.wikipedia.org/wiki/Radio-paging_code_No._1">POCSAG</a>和 <a href="https://en.wikipedia.org/wiki/FLEX_(protocol)">FLEX</a> 寻呼协议。</p><p>请记住,<strong>您当地的法律可能禁止您监听寻呼机流量</strong>。做之前请先检查一下!</p><p>为了监视 OpenWebRX+ 中的寻呼机消息,请选择<em>“寻呼”</em> 数字模式并调谐到寻呼机信号的精确中间位置。您将在瀑布显示屏顶部的单独面板中看到解码的寻呼机消息。</p><p>许多寻呼机消息携带数字或二进制数据。作为 <strong>管理员</strong>,您可以选择忽略这些不可读的消息,方法是转到<em>“设置 | 常规 | 解调和解码 | 其他”</em>并启用<em>“过滤掉空的、数字的或不可读的寻呼机消息”</em>选项。</p><h3 id="监控无线设备-ISM"><a href="#监控无线设备-ISM" class="headerlink" title="监控无线设备 (ISM)"></a><strong>监控无线设备 (ISM)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/ISM_radio_band">什么是ISM?</a></em></p><p>许多现代无线设备,例如气象站、安全传感器、轮胎压力传感器、汽车钥匙等,都使用射频进行通信。这些设备通常位于 433-435MHz、902-928MHz 和其他一些频段。为了监控 OpenWebRX+ 中的智能设备传输,请执行以下操作:</p><ol><li>查看 ISM 频率以查找无线设备可能产生的信号。</li><li>一旦看到任何可疑信号,请在它们附近调谐并选择 <em>“ISM”</em>数字模式。ISM 解码器将监控并显示您调谐频率周围的大范围频谱。</li><li>等待信号再次出现。如果 ISM 解码器能够理解它们,则解码后的数据将显示在瀑布显示屏顶部的单独面板中。</li></ol><p>如果您无法解码任何 ISM 信号或在瀑布上看不到任何信号,<strong>请尝试使用无线车钥匙测试解码器</strong>。不过,了解它们的信号频率很重要。</p><h3 id="跟踪分组无线电-APRS"><a href="#跟踪分组无线电-APRS" class="headerlink" title="跟踪分组无线电 (APRS)"></a><strong>跟踪分组无线电 (APRS)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Automatic_Packet_Reporting_System">什么是APRS?</a></em></p><p>自动<em>数据包报告系统 (APRS)<em>使 HAM 运营商能够交换数字数据、消息并与世界共享其位置。APRS在北美使用144.39MHz频率,在欧洲使用144.8MHz。请注意,OpenWebRX 频段规划仅启用欧洲 APRS 频率。**如果您的接收器位于北美,请编辑频段规划以切换到 144.39MHz 频率。</em></em></p><p>为了监控 OpenWebRX 中的 APRS 流量,请选择<em>“数据包”</em> 数字模式并调谐到上述频率之一。您将在瀑布显示屏顶部的单独面板中看到解码的 APRS 消息。此外,这些消息的来源将在地图上弹出,通过单击<strong>“地图”</strong>按钮即可显示。</p><p>OpenWebRX+ 频段规划还包括一个 APRS 条目,频率为 145.825MHz。这是<em>国际空间站 (ISS) 的</em>频率。一天几次,当国际空间站飞过接收器位置上方时,您可以期望以这个频率从很远的地方看到 APRS 报告。这些报告由位于国际空间站的 APRS 中继器重新传输。</p><h3 id="船舶追踪-AIS"><a href="#船舶追踪-AIS" class="headerlink" title="船舶追踪 (AIS)"></a><strong>船舶追踪 (AIS)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Automatic_identification_system">什么是AIS?</a></em></p><p>现代船舶使用称为 AIS 的甚高频无线电系统报告其位置。如果您的 OpenWebRX+ 接收器位于足够大的水域附近,它可能能够接收 AIS 位置报告并将其显示在地图上。</p><p>AIS 在两个海事频带频率上运行,即 161.975MHz 和 162.025MHz。选择包含这些频率的配置文件后,您将看到它们标有绿色书签,因为它们是频段计划的一部分。单击 AIS 书签,就会出现第二个瀑布,以及显示收到的位置报告的信息面板。</p><p>现在,如果单击<strong>“地图”</strong>按钮,您应该会在地图上看到船舶位置。单击一艘船会弹出一个气泡,显示有关该船的一些基本信息。</p><p>AIS 通过一个称为 MMSI 的唯一编号来识别每艘船只。OpenWebRX+ 显示这些 MMSI 编号,并将它们超链接到 <a href="https://www.vesselfinder.com/">Vessel Finder</a> 网站,您可以在其中找到有关每艘船只的照片和其他信息。</p><h3 id="追踪飞机-ADS-B"><a href="#追踪飞机-ADS-B" class="headerlink" title="追踪飞机 (ADS-B)"></a><strong>追踪飞机 (ADS-B)</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Automatic_Dependent_Surveillance%E2%80%93Broadcast">什么是ADS-B?</a></em></p><p>飞机使用 ADS-B 系统定期报告其在空中的位置,频率为 1090MHz 和 978MHz。OpenWebRX+ 可以监听这些频率并向您显示收到的航班信息。</p><p>要接收 ADS-B 传输,请选择包含 ADS-B 频率之一的配置文件。由于这些传输需要 2MHz 带宽,因此配置文件在 ADS-B 频率的每一侧必须至少具有 1MHz 带宽。</p><p>标准 ADS-B 频率是 OpenWebRX+ 频段计划的一部分,因此标有绿色书签。单击 ADS-B 书签后,将出现一个面板,其中显示报告的飞机及其飞行数据。</p><p>如果单击<strong>“地图”</strong>按钮,您应该会在地图上看到飞机的位置。单击飞机会弹出一个气泡,显示有关该飞机的一些基本信息。</p><p>飞机通过多个不同的 ID 进行识别,包括航班 ID、飞机尾号和 ICAO 代码(又名 S 模式应答器代码)。OpenWebRX+ 会将收到的 ID 超链接到 <a href="https://www.flightaware.com/">FlightAware</a> 网站,您可以在其中找到飞机照片和有关每次航班的其他信息。</p><h2 id="用户特征"><a href="#用户特征" class="headerlink" title="用户特征"></a><strong>用户特征</strong></h2><p>本节介绍没有管理访问权限的普通用户可以使用的各种 OpenWebRX 功能。</p><h3 id="频率扫描仪"><a href="#频率扫描仪" class="headerlink" title="频率扫描仪"></a><strong>频率扫描仪</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Radio_scanner">什么是扫描仪?</a></em></p><p>OpenWebRX+ 包括一个频率扫描仪,允许自动搜索当前显示的活动书签。一旦扫描仪检测到书签频率之一的信号,它将调谐到该频率。一旦频率安静下来,扫描仪将继续搜索。要使用扫描仪,请执行以下操作:</p><ul><li>选择一个配置文件,其中包含一些您感兴趣的书签频率。</li><li>调谐到瀑布的空白部分并左键单击 <strong>SQ</strong>按钮以设置静噪级别。</li><li>右键单击<strong>SQ</strong>按钮开始扫描。<strong>SQ</strong>按钮将呈绿色亮起,表示扫描仪已开启。移动设备用户只需长时间按住按钮即可模拟右键单击。</li><li>完成后,再次右键单击<strong>SQ</strong>按钮以禁用扫描仪。</li></ul><p>请记住,<strong>扫描仪无法在数字语音通道上工作</strong>,因为即使通道上没有实际流量,它们也往往会保持信号打开。</p><h3 id="中继器"><a href="#中继器" class="headerlink" title="中继器"></a><strong>中继器</strong></h3><p><em><a href="https://en.wikipedia.org/wiki/Radio_repeater">什么是中继器?</a></em></p><p>每天一次,OpenWebRX+ 会向 <a href="https://www.repeaterbook.com/">RepeaterBook.com</a>查询 最接近接收器位置的中继器列表。这些中继器显示在地图上,每个中继器都用 <strong>⋈</strong>标记表示。</p><p><em>您可以通过在“设置 | 常规 | 显示 | 中继器书签范围”</em> 中设置与接收器的最大距离,让 OpenWebRX+ 创建中继器书签。<strong>OpenWebRX+ 只会为位于预设最大距离内的中继器创建书签。</strong></p><p>您还可以将中继器书签限制为仅几个配置文件(例如 VHF / UHF):</p><ol><li><em>通过将“设置|常规|显示|中继器书签范围”</em>设置为零来 禁用全局中继器书签。</li><li>转到<em>“设置 | SDR 设备和配置文件 | <设备> | <配置文件>”</em> ,然后单击<strong>“添加”添加一个名为</strong><em>“中继器书签范围”</em>的选项。</li><li>将新添加的选项设置为与您希望看到中继器的接收器的最大距离,并通过单击<strong>“应用”和“保存”</strong>保存配置文件设置。</li></ol><p>需要注意的是,只有在<em>“设置|常规|接收器信息|接收器位置”中</em><strong>设置正确的接收器位置,中继器才会正确显示</strong>。同样重要的是要记住,由于 OpenWebRX+ 每天查询<a href="https://www.repeaterbook.com/">RepeaterBook.com一次,</a><strong>因此在设置接收器位置后可能无法立即获得最新的中继器信息</strong>。</p><h3 id="其他在线接收器"><a href="#其他在线接收器" class="headerlink" title="其他在线接收器"></a><strong>其他在线接收器</strong></h3><p>OpenWebRX+ 将定期查询 <a href="https://www.receiverbook.de/">ReceiverBook</a>、 <a href="http://kiwisdr.com/">KiwiSDR</a>和 <a href="http://websdr.org/">WebSDR.org</a> 网站以获取其他在线 SDR 接收器。这些接收器显示在地图上,每个接收器都标有<strong>◬</strong>标记。红色标记代表 KiwiSDR 接收器,绿色标记对应 OpenWebRX 接收器,蓝色标记代表原始 WebSDR 接收器。单击标记会显示有关接收者的一般信息,以及接收者网页的链接。</p><h3 id="内置聊天"><a href="#内置聊天" class="headerlink" title="内置聊天"></a><strong>内置聊天</strong></h3><p>OpenWebRX+ 包含一个简单的聊天功能,可让连接的用户相互交谈。按 接收者网页顶部的 <strong>“聊天”按钮即可打开聊天面板。</strong></p><p>当您通过在聊天窗口底部输入第一条聊天消息来发送该消息时,OpenWebRX+ 将为您分配一个随机昵称,在您的消息旁边显示给其他用户。要<strong>更改您的姓名</strong>,请在消息输入左侧输入您的新昵称。</p><p>作为<strong>服务器管理员</strong>,您可能希望在 OpenWebRX+ 服务器上<strong>禁用聊天。</strong>为此,请转到<em>“设置|常规|接收器限制”</em>并禁用<em>“允许用户互相聊天”</em>选项。聊天按钮将变成<strong>日志</strong>按钮,日志面板不接受用户的任何输入 <strong>。</strong></p><h2 id="管理员功能"><a href="#管理员功能" class="headerlink" title="管理员功能"></a><strong>管理员功能</strong></h2><p>本节讨论管理 OpenWebRX 服务器以及除了提供对无线电波的公共访问之外如何使用它。</p><h3 id="后台解码"><a href="#后台解码" class="headerlink" title="后台解码"></a><strong>后台解码</strong></h3><p>作为<strong>服务器管理员</strong>,您可以让 OpenWebRX 服务器 在有人通过这些传输收听配置文件时<strong>自动解码无线电传输。</strong>此功能可用于接收 SSTV 图像、传真、监控数字 HAM 流量、跟踪飞机等。</p><p>要开始后台解码,请转到<em>“设置|后台解码”</em>,选中<em>“启用后台解码服务”</em> 选项,然后选择您想要自动接收和解码的传输模式。确保只选择您真正需要的解码器,因为运行太多后台解码器会大大降低服务器速度。</p><p>现在,转到要用于后台解码的 SDR 设备,让我们说<em>“设置 | SDR 设备和配置文件 | <设备>”</em>,然后添加<em>“在此设备上运行后台服务”</em>选项。添加此选项后,请确保已启用它。</p><p>此时,每次有人连接并收听 <em><code><Device></code><em>配置文件时,OpenWebRX 都会<strong>自动解码标有绿色书签的频率上的所有启用的信号类型</strong>,即频段计划一部分的所有信号。如果解码的数据是图像或消息日志,这些数据将保存到</em>/tmp</em>文件夹中,并在单击<strong>“文件”</strong>按钮后显示。<strong>当您单击“地图”</strong>按钮时,位置报告(例如 FT8、WSPR、APRS 等)将显示在地图上。</p><p>为了以不属于<strong>频段</strong> 计划的频率启用后台解码(<strong>无</strong>绿色书签),您必须通过编辑以下文件将该频率添加到频段计划中:</p><p>/etc/openwebrx/bands.json</p><p>在编辑此文件之前,请确保<strong>创建备份副本</strong>,以防出现问题。不幸的是,目前无法通过基于网络的设置来编辑频段计划。编辑并保存文件后,按如下方式重新启动 OpenWebRX,并确保在您添加的频率处有一个绿色书签:</p><p>sudo systemctl 重新启动 openwebrx</p><h3 id="预定解码"><a href="#预定解码" class="headerlink" title="预定解码"></a><strong>预定解码</strong></h3><p>在<a href="https://fms.komkon.org/OWRX/#HOW-BACKGROUND">上一节</a>中,我们讨论了 OpenWebRX 如何在有人使用时自动解码无线电传输。在本节中,我们将让OpenWebRX在没有人使用时 <strong>自行运行无线电并接收信号。</strong></p><p>通过转至<em>“设置 | SDR 设备和配置文件 | <设备>”,从</em>之前启用后台服务的 SDR 设备开始。向该设备添加<em>“调度程序”选项,并在其他设置中找到新添加的调度程序选择器。</em>它将为您提供两种不同的时间表模型:</p><ul><li><strong>日光调度程序</strong> 日光调度程序允许您选择三个配置文件在白天、夜间和“灰线”时段(即黎明和黄昏)在设备上运行。由于无线电波传播取决于一天中的时间,因此该方案提供了易于配置且功能齐全的时间表。</li><li><strong>静态调度程序</strong> 静态调度程序可让您以分钟的精度定义自己的日程表,其中包含任意数量的条目。虽然添加这样的时间表比较困难,但它使您可以灵活地每小时切换多个不同的配置文件。</li></ul><p>添加并保存日程后,<strong>只要没有人在使用该设备,OpenWebRX 就会在预定的配置文件之间切换设备</strong>。一旦所有用户断开连接,OpenWebRX 会将 SDR 设备返回到其当前计划的配置文件。它还将运行您之前启用的任何适用的后台解码器,将收到的数据报告给地图或将其保存到文件存储中。</p><h3 id="报告解码数据"><a href="#报告解码数据" class="headerlink" title="报告解码数据"></a><strong>报告解码数据</strong></h3><p>在 <a href="https://fms.komkon.org/OWRX/#HOW-BACKGROUND">前两节</a> <a href="https://fms.komkon.org/OWRX/#HOW-SCHEDULED">中</a> ,我们讨论了如何配置 OpenWebRX 以自动解码各种无线电传输。在本节中,我们将讨论将解码后的数据发送到在线服务,例如 <a href="https://aprs.fi/">APRS-IS</a>、 <a href="https://pskreporter.info/">PSKReporter</a>和 <a href="https://wsprnet.org/">WSPRnet</a>。要配置在线报告,请转至<em>“设置 | 发现和报告”</em>设置页面。那里有三个部分,用于 OpenWebRX 可以报告的三种类型的数据:</p><ul><li><strong>APRS-IS</strong> 接收到的APRS位置报告可以发送到 <a href="https://www.aprs2.net/">APRS-IS网络</a>。为此,请填写您的 APRS 呼号和最近的服务器地址。您可能还需要提供 APRS-IS 网络密码。最后,选中<em>“将收到的 APRS 数据发送到 APRS-IS”</em>选项。报告的数据将显示在 <a href="https://aprs.fi/">APRS.fi 地图</a>上。请注意, <a href="https://aprs.fi/">APRS.fi</a> 不会显示多重报告点,因此您的某些报告可能不会显示在那里。</li><li>如果您还想向 APRS-IS报告您的<strong>接收器位置,请选中</strong><em>“将接收器位置发送到 APRS-IS 网络”</em>选项并填写有关您的接收器和天线详细信息的信息。</li><li>请注意,只有一个解码器可以使用相同的呼号<strong>向 APRS-IS 网络发送数据。</strong>因此,如果您有多个 APRS 解码器正在运行(例如,在 144.39MHz 和 145.825MHz 下),您的某些报告将无法通过。要解决此问题,请在 bandplan 文件中 <strong>禁用除一个 APRS 频率之外的所有频率。</strong></li><li><strong>PSKReporter OpenWebRX 可以向</strong><a href="https://pskreporter.info/">PSKReporter</a> 网站 报告 FT8、FT4、JT9、JT65、FST4、JS8、Q65、WSPR、FST4W 和 MSK144 传输 。您所需要做的就是选中<em>“启用向 pskreporter.info 发送点”</em>选项,并使用唯一的名称填写呼号字段。它<strong>不一定</strong>是您的官方 HAM 呼号,但大多数拥有 HAM 呼号的人都在这里使用它们。报告的数据将显示在 <a href="https://pskreporter.info/pskmap">PSKReporter 地图</a>上。您可能还想在天线信息字段中描述您的天线,以便其他人知道您如何接收所报告的数据。</li><li></li><li></li><li><strong>WSPRnet</strong> WSPRnet 网站<a href="https://wsprnet.org/">仅</a> 接受 WSPR 和 FST4W 报告。要启用它,请选中 <em>“启用向 wsprnet.org 发送点”</em>选项,然后在呼号字段中输入您的唯一名称。它<strong>不一定</strong>是您的官方 HAM 呼号,但大多数拥有 HAM 呼号的人都在这里使用它们。报告的数据将显示在 <a href="http://www.wsprnet.org/drupal/wsprnet/map">WSPRnet 地图</a>上。</li></ul><h3 id="配置地图"><a href="#配置地图" class="headerlink" title="配置地图"></a><strong>配置地图</strong></h3><p>OpenWebRX+ 提供<strong>两种地图选项:</strong><em><strong>Google 地图</strong></em>和基于<em>Leaflet库</em><strong>的免费地图集合</strong>。非常流行的<em>OpenStreetMap</em>就是该集合的一部分。</p><p>Google<em>地图的</em>实现更加详细和完善,但它可能需要您向 Google 注册您的信用卡才能接收 API 密钥。<em>如果您超过Google 地图</em>访问的特定限制,Google 可能会向您的信用卡收取费用。</p><p>OpenStreetMap和<em>Leaflet</em>中包含的其他地图 不太详细,但它们是完全免费的<em>。</em>此外,<em>Leaflet</em> 实现还包括一些用于天气、海事注释等的额外层。</p><p><strong>要配置默认地图</strong>,请转到<em>“设置|常规|地图|地图类型”</em>,然后选择您想要默认向用户显示的地图。请记住,用户始终可以通过单击<strong>“地图”</strong>按钮来切换地图。同一设置部分中提供的其他与地图相关的选项包括:</p><ul><li><strong>Google 地图 API 密钥</strong> 您可以在此处输入从 Google 收到的<em>Google 地图API 密钥。</em>如果您没有 API 密钥,请将此字段留空。很多时候, 出于某种原因,<em>谷歌地图</em>无论如何都能工作。</li><li><strong>OpenWeatherMap API 密钥</strong> 如果您想在<em>Leaflet</em>地图上查看全球天气,请考虑获取<em>OpenWeatherMap</em> API 密钥并在此处输入。这些密钥是免费的,但功能有限。如果没有此密钥,OpenWebRX+ 将只能向您显示从 <em>WeatherRadar</em>获取的美国天气。</li><li><strong>地图保留时间</strong> 这是接收到的位置报告在地图上保持可见的时间(以秒为单位)。一旦位置报告超过保留时间的一半,位置报告就会开始变暗。一旦达到保留时间,位置报告将从地图上消失。</li><li><strong>呼号数据库 URL</strong> 这是当您在地图上单击报告的 HAM 呼号时用于查找这些呼号的网站。<em>“{}”</em>字符将替换为实际呼号。这里两个常见的选择是 <a href="https://www.qrz.com/">qrz.com</a>和 <a href="https://www.qrzcq.com/">qrzcq.com</a>。</li><li><strong>船舶数据库 URL</strong> 这是当您在地图上单击船舶 MMSI 编号时用于查找船舶的网站。<em>“{}”</em>字符将替换为实际的 MMSI 号码。</li><li><strong>航班数据库 URL</strong> 这是当您在地图上单击航空公司航班 ID 时用于查找航空公司航班 ID 的网站。<em>“{}”</em>字符将替换为实际的航班 ID。</li><li><strong>飞机数据库 URL</strong> 这是当您在地图上单击飞机时用于查找飞机 S 模式 ID 的网站。<em>“{}”</em>字符将替换为实际的 S 模式 ID。</li></ul><h3 id="限制接收器的使用"><a href="#限制接收器的使用" class="headerlink" title="限制接收器的使用"></a><strong>限制接收器的使用</strong></h3><p>作为<strong>服务器管理员</strong>,您可能出于法律或技术原因<strong>限制</strong>公众使用您的 OpenWebRX 服务器。请务必检查您所在位置允许收听的无线电频率和模式。<strong>请勿</strong>向公众提供禁止的频率和模式。<em>“设置|常规|接收器限制”</em>中提供以下限制 :</p><ul><li><strong>最大客户端数量</strong> 此设置决定有多少人可以同时连接到您的 OpenWebRX 服务器。任何尝试连接到“完整”服务器的人都会收到一条错误消息并被拒绝服务。</li><li><strong>最大文件数</strong> 此设置确定 OpenWebRX+ 在开始删除最旧的文件之前允许保留从空中接收到的 SSTV 图像、传真和其他文件的数量。按接收器网页顶部的 <strong>“文件”</strong>按钮可以查看接收到的文件 。</li><li><strong>会话超时</strong> 该值(以秒为单位)确定允许用户使用 OpenWebRX+ 接收器的时间长度。不过,重新加载接收者的网页会重新启动时间,因此超时主要发生在那些让计算机保持 OpenWebRX+ 页面打开的人身上。</li><li><strong>使用策略 URL</strong> 一旦用户的会话超时,就会向用户显示此网页。默认页面解释了为什么会出现超时,并让用户可以找到其他在线接收器来收听。</li><li><strong>允许用户互相聊天</strong> 如果您想禁用内置聊天功能,请禁用此选项。禁用后,聊天面板将变成不接受任何输入的日志面板。</li><li><strong>允许用户录制收到的音频</strong> 如果您不希望用户录制他们正在收听的任何音频,请禁用此选项。禁用后,<strong>REC</strong> 按钮将从用户界面中消失。请记住,这<strong>不会</strong>阻止您的用户通过其他方式录制音频。</li><li><strong>允许用户更改中心频率</strong> 如果您想让 OpenWebRX+ 用户通过右键单击圆形箭头按钮“回避”其当前配置文件,请启用此选项。由于侦听同一配置文件的所有用户都会发生此更改,因此在许多人侦听相同配置文件的服务器上禁用它是有意义的。</li><li><strong>魔法密钥</strong> 当魔法密钥字符串被填写(即不为空)时,OpenWebRX+ 将只允许对知道魔法密钥并提供它的人进行侧步配置文件,如下所示:</li><li><a href="http://openwebrx.receiver.org:8073/#">http://openwebrx.receiver.org:8073/#</a> <strong>key=<code><magic-key></code></strong></li></ul><h3 id="监控接收器的使用"><a href="#监控接收器的使用" class="headerlink" title="监控接收器的使用"></a><strong>监控接收器的使用</strong></h3><p>OpenWebRX+<strong>允许其管理员监控</strong>服务器连接并<strong>禁止滥用用户</strong>。请注意,由于 OpenWebRX 项目的主要目标是提供免费、开放的在线广播,因此应极其小心地使用该设施。如果您想拥有真正私有的 OpenWebRX 服务器,请考虑将其关闭以供公共访问。</p><p><img src="https://huangetech.feishu.cn/space/api/box/stream/download/asynccode/?code=MjA2MWQ0NDFmN2IwNjcxNjMzNTAxZTg2MzdhYTJkMzZfM2NmbUpzdVYyd2ZzVUNsRTNFU0FQWmdGMDlKYnpLenVfVG9rZW46S1pzdmJaS0Vub3d1a0Z4WmNxdGNIaUxrbmpoXzE3MTc1Njg4NjM6MTcxNzU3MjQ2M19WNA" alt="img"></p><p>为了查看当前连接的客户端,请单击 <strong>“设置”</strong>按钮并滚动到页面底部,直到看到<em>“客户端”</em>显示,如上所示。在那里,您将能够在选定的时间内 <strong>禁止客户端的 IP 地址,或取消禁止</strong>以前禁止的地址。被禁止的客户端仍然可以看到地图和文件,但无法访问接收器本身。</p><p>您还可以通过将消息输入到输入字段并单击 <strong>发送按钮来向所有当前连接的客户端广播消息</strong>。您的消息将显示在客户的日志/聊天面板中。</p><p>**如果您在 NGINX 后面运行 OpenWebRX+**,您可能无法看到客户端的 IP 地址,除非您编辑此文件:</p><p>/etc/nginx/sites-enabled/openwebrx</p><p>并将以下行添加到<strong>位置部分</strong>:</p><p>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</p><h2 id="经常问的问题"><a href="#经常问的问题" class="headerlink" title="经常问的问题"></a><strong>经常问的问题</strong></h2><h3 id="OpenWebRX-升级后坏了!"><a href="#OpenWebRX-升级后坏了!" class="headerlink" title="OpenWebRX 升级后坏了!"></a><strong>OpenWebRX 升级后坏了!</strong></h3><p><strong>在桌面浏览器中,尝试在按住SHIFT</strong>键 的同时重新加载接收器网页 。在移动浏览器中,清除浏览器缓存并重新加载页面。如果这没有帮助,请尝试重新启动运行 OpenWebRX 的计算机。</p><h3 id="新的-OpenWebRX-功能未显示!"><a href="#新的-OpenWebRX-功能未显示!" class="headerlink" title="新的 OpenWebRX 功能未显示!"></a><strong>新的 OpenWebRX 功能未显示!</strong></h3><p>单击<em>“设置 | 功能报告”</em>,查看您感兴趣的功能是否显示为已启用。如果某个功能被禁用,该报告将告诉您应该如何启用它。</p><h3 id="数字语音模式不显示!"><a href="#数字语音模式不显示!" class="headerlink" title="数字语音模式不显示!"></a><strong>数字语音模式不显示!</strong></h3><p><em>数字语音模式(DMR、D-STAR、YSF、NXDN)需要Digital Voice Systems Inc</em> 获得专利的 AMBE 编解码器算法。因此,OpenWebRX 和 OpenWebRX+ 都不包含开箱即用的数字语音支持。<strong>您个人有责任</strong>将必要的部分添加到您自己的 OpenWebRX 安装中。</p><p>将数字语音模式添加到 OpenWebRX 的正确且具有法律责任的方法是连接一个 在硬件中实现 AMBE 编解码器的<a href="https://github.com/jketterl/openwebrx/wiki/AMBE-vocoder-device-notes">许可 USB 加密狗。OpenWebRX 和 OpenWebRX+ 都将以最少的配置工作</a>支持常见的 AMBE 加密狗模型 。</p><p>如果您出于某种原因不想使用 AMBE 编解码器加密狗,可以使用未经许可的 <a href="https://github.com/szechyjs/mbelib">MBELib</a> 软件实现,其来源相当可疑。MBELib 的使用可能会被解释为专利侵权。如果您同意的话,有<a href="https://fms.komkon.org/OWRX/install-softmbe.sh">一个脚本</a>可以为 OpenWebRX 添加 MBELib 支持。运行如下:</p><p>sudo install-softmbe.sh</p><p>通过任一方法安装数字语音支持后,请访问 <em>“设置 | 功能报告”</em>页面以验证安装是否成功。您现在应该在接收器网页上看到数字语音按钮。</p><h3 id="我的-SDRplay-设备无法可靠工作!"><a href="#我的-SDRplay-设备无法可靠工作!" class="headerlink" title="我的 SDRplay 设备无法可靠工作!"></a><strong>我的 SDRplay 设备无法可靠工作!</strong></h3><p>SDRplay 设备及其克隆设备出了名的容易出现故障,需要良好的电源才能可靠运行。如果您在使用这些设备时遇到超时或故障,请尝试通过有源 USB 集线器连接它们。如果这没有帮助,并且您拥有正品 SDRplay 设备(不是克隆设备), 请 在 SDRplay 网站上<a href="https://www.sdrplay.com/support/open.php">开具票证。</a>OpenWebRX 开发人员<strong>无法</strong>帮助您解决 SDRplay 硬件问题。</p><h3 id="你能实现我想要的功能吗?"><a href="#你能实现我想要的功能吗?" class="headerlink" title="你能实现我想要的功能吗?"></a><strong>你能实现我想要的功能吗?</strong></h3><p>一般来说,<strong>没有</strong>。OpenWebRX 是一个非盈利项目,由极少数人在业余时间开发。这些开发人员会优先考虑他们认为个人感兴趣、很多人反复请求或易于实现的功能。</p><p>话虽如此,您想要的功能很可能已经实现,或者可以通过其他方式实现,或者由于某种原因已被考虑和避免。请仔细阅读本文档,特别是<a href="https://fms.komkon.org/OWRX/#FAQ">常见问题解答部分</a>。</p><p>此外,由于 OpenWebRX 是一个开源项目,因此<strong>您可以自行添加所需的功能</strong>。查看 <a href="https://github.com/jketterl/openwebrx">原始 OpenWebRX 源代码</a> 或 <a href="https://github.com/luarvique/openwebrx">OpenWebRX+ 源代码</a> 并考虑参与 OpenWebRX 开发。</p><h3 id="如何向用户隐藏某些个人资料?"><a href="#如何向用户隐藏某些个人资料?" class="headerlink" title="如何向用户隐藏某些个人资料?"></a><strong>如何向用户隐藏某些个人资料?</strong></h3><p>由于 OpenWebRX 是一个<strong>开放的</strong>在线接收器,因此它<strong>不允许</strong> 您向公众隐藏个人资料。如果您想私下访问您的接收器,最好的选择是使其无法通过互联网访问。</p><p>话虽如此,有一个选项可以阻止用户更改连接到 OpenWebRX+ 的特定 SDR 设备上的配置文件。如果此 SDR 设备执行后台解码并根据自己的时间表更改配置文件,那么它会很有用。要启用此选项,请执行以下操作:</p><ol><li>转至<em>“设置 | 常规设置 | 接收器限制 | 魔术键” ,然后设置您想要用于</em><strong>强制</strong> 在受保护设备上切换配置文件的 魔术键值。</li><li>转到<em>“设置 | SDR 设备和配置文件 | <设备>”</em>,从<em>“其他可选设置”中选择“需要魔术键才能在此设备上切换配置文件”</em>,然后单击<strong>“添加”</strong>。</li><li>确保选中<em>“需要魔术键才能在此设备上切换配置文件”</em>复选框,然后单击<strong>“应用”和“保存”</strong>。</li></ol><p>从现在开始,用户只能通过在 URL 中提供预配置的魔术键值来更改设备上的配置文件,如下所示:</p><p><a href="http://openwebrx.receiver.org:8073/#">http://openwebrx.receiver.org:8073/#</a> <strong>key=<code><magic-key></code></strong></p><h3 id="如何跳转到任意频率?"><a href="#如何跳转到任意频率?" class="headerlink" title="如何跳转到任意频率?"></a><strong>如何跳转到任意频率?</strong></h3><p>由于 OpenWebRX 根据“配置文件”(即预配置的频率范围)工作,因此您<strong>无法</strong>跳转到任意频率,因为新频率可能需要不同的配置文件设置。此外,收听相同配置文件的其他用户可能不喜欢您跳到全新的频率。</p><p>尽管如此,OpenWebRX+ 确实提供了一种“回避”当前配置文件、转到相邻频率的方法。要启用侧步,请执行以下操作:</p><ol><li>转到<em>“设置|常规设置|接收器限制”</em>并确保选中 <em>“允许用户更改中心频率”复选框。</em></li><li>如果您想使用魔术键保护频率变化,请在相邻的<em>“魔术键”</em>字段中输入。</li><li>单击<strong>应用并保存</strong>以保存更改。</li></ol><p>从现在开始,您可以通过右键单击接收器网页顶部的大圆形箭头来超出预先配置的频率范围。没有鼠标的移动用户只需用手指按住这些大圆形箭头大约一秒钟即可。</p><p>如果配置了魔术键,则只有在 URL 中提供该键时才能回避配置文件,如下所示:</p><p><a href="http://openwebrx.receiver.org:8073/#">http://openwebrx.receiver.org:8073/#</a> <strong>key=<code><magic-key></code></strong></p><h3 id="OpenWebRX-配置文件在哪里?"><a href="#OpenWebRX-配置文件在哪里?" class="headerlink" title="OpenWebRX 配置文件在哪里?"></a><strong>OpenWebRX 配置文件在哪里?</strong></h3><p>如果您想备份 OpenWebRX 配置文件,它们的位置如下:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-regexp">/var/</span>lib<span class="hljs-regexp">/openwebrx/</span>settings.json<br><span class="hljs-regexp">/var/</span>lib<span class="hljs-regexp">/openwebrx/</span>bookmarks.json<br><span class="hljs-regexp">/var/</span>lib<span class="hljs-regexp">/openwebrx/u</span>sers.json<br><span class="hljs-regexp">/etc/</span>openwebrx/openwebrx.conf<br><span class="hljs-regexp">/etc/</span>openwebrx/bands.json<br></code></pre></td></tr></table></figure><p>您应该<strong>避免手动编辑配置文件</strong>,因为它们通常是通过基于 Web 的设置界面进行修改的。如果您决定编辑配置文件,请务必先<strong>确保您有备份副本</strong>。更新配置文件后,使用以下命令重新启动 OpenWebRX:</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">sudo systemctl restart openwebrx</span><br></code></pre></td></tr></table></figure><h3 id="如何让-OpenWebRX-使用-HTTPS-协议?"><a href="#如何让-OpenWebRX-使用-HTTPS-协议?" class="headerlink" title="如何让 OpenWebRX 使用 HTTPS 协议?"></a><strong>如何让 OpenWebRX 使用 HTTPS 协议?</strong></h3><p>虽然原始 OpenWebRX 版本不支持 HTTPS 协议,但 OpenWebRX+ 支持。为了在 OpenWebRX+ 中启用 HTTPS,<strong>您将需要 SSL 证书文件 (</strong> <em><strong>cert.pem</strong></em> <strong>) 及其密钥 (</strong> <em><strong>key.pem</strong></em> **)**。获得这两个文件后,请执行以下操作:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs awk">sudo cp <cert.pem> <span class="hljs-regexp">/etc/</span>openwebrx/cert.pem<br>sudo cp <key.pem> <span class="hljs-regexp">/etc/</span>openwebrx/key.pem<br>sudo chown openwebrx:openwebrx <span class="hljs-regexp">/etc/</span>openwebrx/cert.pem<br>sudo chown openwebrx:openwebrx <span class="hljs-regexp">/etc/</span>openwebrx/key.pem<br>sudo chmod <span class="hljs-number">660</span> <span class="hljs-regexp">/etc/</span>openwebrx/cert.pem<br>sudo chmod <span class="hljs-number">660</span> <span class="hljs-regexp">/etc/</span>openwebrx/key.pem<br>sudo systemctl restart openwebrx<br></code></pre></td></tr></table></figure><h3 id="如何去掉默认的黄色书签?"><a href="#如何去掉默认的黄色书签?" class="headerlink" title="如何去掉默认的黄色书签?"></a><strong>如何去掉默认的黄色书签?</strong></h3><p>OpenWebRX+ 附带了一些常见频率的预定义书签,例如天气信息、CB 频道等。如果您不喜欢看到这些书签,请删除它们并重新启动 OpenWebRX+,如下所示:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs awk">sudo rm -f <span class="hljs-regexp">/etc/</span>openwebrx<span class="hljs-regexp">/bookmarks.d/</span>*<br>sudo systemctl restart openwebrx<br></code></pre></td></tr></table></figure><p>如果您只想删除<strong>某些书签,请删除或编辑</strong><em>/etc/openwebrx/bookmarks.d</em>文件夹中的单个文件。</p><p>本文档由<a href="https://github.com/muzihuaner">木子欢儿</a>翻译制作</p><p>参考:</p><p><a href="https://www.openwebrx.de/">https://www.openwebrx.de/</a></p><p><a href="https://fms.komkon.org/OWRX/">https://fms.komkon.org/OWRX/</a></p><p><a href="https://luarvique.github.io/ppa/">https://luarvique.github.io/ppa/</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>业余无线电</tag>
<tag>OpenWebRXPlus</tag>
</tags>
</entry>
<entry>
<title>短波气象传真接收指南(JMH)</title>
<link href="/2024/01/19/%E7%9F%AD%E6%B3%A2%E6%B0%94%E8%B1%A1%E4%BC%A0%E7%9C%9F%E6%8E%A5%E6%94%B6%E6%8C%87%E5%8D%97/"/>
<url>/2024/01/19/%E7%9F%AD%E6%B3%A2%E6%B0%94%E8%B1%A1%E4%BC%A0%E7%9C%9F%E6%8E%A5%E6%94%B6%E6%8C%87%E5%8D%97/</url>
<content type="html"><![CDATA[<p>短波气象传真是一种通过短波无线电频段传输天气信息的技术。它通过发送特定编码的图像信号,包括气象图、天气预报、海洋气象等,使接收者能够获取到实时的气象数据。短波气象传真广泛应用于航海、航空、军事、科学研究等领域,特别是在远离陆地的地区或通信网络不稳定的地方。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401191246162.png" alt="接收日本JMH气象传真"></p><p>在网络通信不发达的年代,一些远洋航船会配备气象传真接收机(当然现在也有),靠接收海岸台的气象传真图来分析预测海上天气情况。虽然现在信息技术发达,获取海上天气信息不困难,但是在某些特殊的情况下,短波气象传真仍然能发挥很关键的作用。</p><p>设备:支持USB模式的短波电台、收音机、SDR设备…</p><p>软件:<a href="http://www2.plala.or.jp/hikokibiyori/soft/kgfax/index.html">KG-FAX</a>(电脑),<a href="https://www.jvcomm.de/dlframee.html">JVComm32</a>(电脑),HF Weather FAX(手机,PC)</p><p>如果你没有设备也可以用在线SDR(可以直接解码)</p><p><a href="http://rx.linkfanel.net/">http://rx.linkfanel.net/</a></p><p><a href="https://www.receiverbook.de/map">https://www.receiverbook.de/map</a></p><p>资料:</p><ol><li>世界海洋无线传真广播时间表:<a href="http://jump2.bdimg.com/safecheck/index?url=rN3wPs8te/px8ICLA1PGU2t1rq86a3q/MPNkgj4fnOA4vW1A3N4BgHuJz61kgmHnhnoAMddgPYAwtTuNrmg9xbRe0xtPlUJzEOPG/O8jzRhNcVpdor8ZTSnjEhRVN7AFWhjEKoKm7IxcTDmXX0jkYVu8876ofQldwDmCuXSqH1IN0JW7pjPTVTA8Zu4mdgY0">https://c.ibcl.us/JMHWeather-Fax_20180706/rfax.pdf</a></li><li>JMH的播报时间表 <a href="http://jump2.bdimg.com/safecheck/index?url=x+Z5mMbGPAs4HtWJxmvDU6ERvpJwpyO+1MstWQ3FdpvDwFAHvIyDDPcTDOMYcNvBI/k5TeUqrqK1AxOp1yqEBbRe0xtPlUJzEOPG/O8jzRhNcVpdor8ZTSnjEhRVN7AFWhjEKoKm7IxcTDmXX0jkYVu8876ofQldwDmCuXSqH1IN0JW7pjPTVTA8Zu4mdgY0">http://www.jma-net.go.jp/common/177jmh/JMH-ENG.pdf</a></li><li>全球海岸电台:<a href="https://weatherfax.com/">https://weatherfax.com/</a></li></ol><p>频率:</p><p>日本气象JMH:13987.5KHz 7794KHz 3621.5KHz</p><p>(JMH的气象图基本都是北太平洋区域的)</p><p>上海海岸电台XSG:12382KHz 16559KHz 4170KHz 8302KHz</p><p>(XSG的气象图是中国东南沿海区域及北太平洋区域的)</p><p>广州海岸台XSQ: 4199.8 KHz 8412.5 KHz 12629.3 KHz 16826.3 KHz</p><p>(暂时未收到过 QAQ )</p><p>这里以日本JMH气象传真为例:</p><p><strong>日本东京气象厅气象无线电传真广播台(JMH)</strong></p><p>以海上船舶为主要服务对象,它不仅提供地面、高空、海洋的各种气象、水文的实况分析资料,而且还提供各种气压形势、气象要素、海面状况及其它物理量的短、中期预报图。由于JMH台广播的气象传真资料种类比较齐全,因此对提高北太平洋区域的天气预报时效和预报服务质量起了很大作用。</p><p><strong>接收模式:USB</strong></p><p><strong>接收频率,接收时间,接收内容:</strong></p><table><thead><tr><th align="center">JMH</th><th align="center">JMH2</th><th align="center">JMH4</th></tr></thead><tbody><tr><td align="center">3621.5kHz</td><td align="center">7794kHz</td><td align="center">13987.5kHz</td></tr></tbody></table><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401191240868.png" alt="78d8d789d889b81713c7bdf540f635a0"></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401191241142.png" alt="b61609c85fea1f045be2367e656bf283"></p><p><strong>气象传真图的种类</strong></p><p>种类:气象传真图的内容丰富、种类繁多。航海最常用的气象传真图主要有:</p><p>(1)地面图:地面分析图(AS),地面预报图(FS)</p><p>(2)高空图:高空分析图(AU),高空预报图(FU)</p><p>(常用的高空图—500hPa、700hPa、850hpa)</p><p>(3)波浪图:波浪分析图(AW),波浪预报(FW)</p><p>(4)辅助图:卫星云图(VS-可见光云图;IR-红外云图),海冰图(ST-冰况图,FI-冰况预报图),海流图(SO-海流实况图,FO-海流预报图),海温图(CO-海温分布图,FO-海温预报图),风暴警报图WT等。</p><p><strong>图题内容</strong></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401191246487.png" alt="接收日本JMH气象传真"></p><p>表1—气象传真图图名标题</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401191247411.png" alt="接收日本JMH气象传真"></p><p>表2—常用传真图类别代号</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401191247675.png" alt="接收日本JMH气象传真"></p><p>表3—常用传真图区域代号</p><p>参考:</p><p><a href="http://www.qxkj.net.cn/qxkj/article/abstract/19800342">日本东京气象传真图的识别</a></p><p><a href="https://bh8sel.com/5179.html">接收日本JMH气象传真</a></p><p><a href="https://www.bilibili.com/read/cv8263794/">短波气象传真接收方法和心得体会o(^o^)o</a></p><p><a href="https://ibcl.us/archive/JMHWeather-Fax_20180706.html">接收日本JMH气象传真</a></p><p><a href="https://zh.wikipedia.org/wiki/%E6%97%A0%E7%BA%BF%E7%94%B5%E4%BC%A0%E7%9C%9F">无线电传真 - 维基百科,自由的百科全书</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>业余无线电</tag>
<tag>短波</tag>
<tag>气象</tag>
</tags>
</entry>
<entry>
<title>用树莓派搭建自己的FM电台并进行直播</title>
<link href="/2024/01/14/%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84FM%E7%94%B5%E5%8F%B0%E5%B9%B6%E8%BF%9B%E8%A1%8C%E7%9B%B4%E6%92%AD/"/>
<url>/2024/01/14/%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84FM%E7%94%B5%E5%8F%B0%E5%B9%B6%E8%BF%9B%E8%A1%8C%E7%9B%B4%E6%92%AD/</url>
<content type="html"><![CDATA[<blockquote><p>进行操作前首先请先备份树莓派数据,防止操作过程中出现的问题导致数据丢失!<br>连接杜邦线的长度不宜过长,防止发射范围超过法律规定,切勿违犯无线电管理条例!<br>操作过程中会设置force_turbo=1强制超频将使得树莓派官方保修失效!请考虑好再进行操作。</p></blockquote><h2 id="《中华人民共和国无线电管理条例》"><a href="#《中华人民共和国无线电管理条例》" class="headerlink" title="《中华人民共和国无线电管理条例》"></a><a href="https://www.gov.cn/zhengce/content/2016-11/25/content_5137687.htm">《中华人民共和国无线电管理条例》</a></h2><p>早就听说过树莓派能够发射广播信号,奈何当时没有树莓派,无法进行尝试。</p><p>现在有了一个树莓派3B,可以玩了~</p><p>接下来教你如何用树莓派搭建一个自己的FM电台并发射直播信号进行直播</p><p>所需要的材料:电脑一台、树莓派(看适配列表)一个,杜邦线一条(选配,也可以用铜线、铜丝代替),收音机一台(或者有FM收音功能的设备,比如手机,对讲机,电台)</p><p>主要用到的软件:rpitx。它可以让树莓派发射5 KHz到1500 MHz之间的广播信号。</p><p><a href="https://github.com/F5OEO/rpitx">https://github.com/F5OEO/rpitx</a></p><p>除此之外你还可以用</p><p><a href="https://github.com/ChristopheJacquet/PiFmRds">https://github.com/ChristopheJacquet/PiFmRds</a></p><p><a href="https://github.com/markondej/fm_transmitter">https://github.com/markondej/fm_transmitter</a></p><p>适配列表</p><table><thead><tr><th>树莓派型号</th><th align="center">状态</th></tr></thead><tbody><tr><td>Pizero</td><td align="center">OK</td></tr><tr><td>PizeroW</td><td align="center">OK</td></tr><tr><td>PiA+</td><td align="center">OK</td></tr><tr><td>PiB</td><td align="center">部分</td></tr><tr><td>PiB+</td><td align="center">OK</td></tr><tr><td>P2B</td><td align="center">OK</td></tr><tr><td>Pi3B</td><td align="center">OK</td></tr><tr><td>Pi3B+</td><td align="center">OK</td></tr><tr><td>Pi4</td><td align="center">测试</td></tr></tbody></table><p>注:切勿在没有带通滤波器的情况下使用天线传输</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141557337.png" alt="img"></p><h2 id="安装rpitx"><a href="#安装rpitx" class="headerlink" title="安装rpitx"></a>安装rpitx</h2><p>实测在<a href="https://downloads.raspberrypi.org/">Raspberry Pi OS 64位</a>版本上安装成功并能正常运行。</p><ol><li>先更新树莓派上的软件包:<code>sudo apt update</code></li><li>之后安装Git: <code>sudo apt install git</code></li></ol><p>注:rpitx软件源在Github,国内直接访问可能有些许困难,安装过程也需要一直连接Github安装依赖。因此安装好Git后建议提前给树莓派上的Git配置好代理,可以保证之后的安装比较顺利。搜索关键字:Git 配置代理</p><ol><li><p>cd到合适的位置(有权限的位置),拉取rpitx在Github的代码:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">git clone https:<span class="hljs-regexp">//gi</span>thub.com<span class="hljs-regexp">/F5OEO/</span>rpitx<br></code></pre></td></tr></table></figure></li><li><p>进入rpitx文件夹:<code>cd rpitx</code></p></li><li><p>安装rpitx:<code>./install.sh</code></p></li></ol><p>之后就是漫长的安装过程了,中间会有一些报错,但是只要安装没有停下来就问题不大。</p><p>在安装最后,会提示是否允许修改 <code>/boot/config.txt</code>,这一步要求我们将GPU的频率锁定在250Mhz,并设置 <code>force_turbo=1</code>强制超频。 <strong>注意!设置 <code>force_turbo=1</code>强制超频将使得树莓派保修失效。</strong> 输入y并回车,之后重启树莓派即可。(不要修改 <code>config.txt</code>文件)</p><h2 id="rpitx测试"><a href="#rpitx测试" class="headerlink" title="rpitx测试"></a>rpitx测试</h2><p>现在让我们测试一下是否正确安装了rpitx。如果你的树莓派有金属保护壳的话,将保护壳拿下来,把树莓派暴露出来,否则收音机收不到足够的信号。</p><ol><li>先进入rpitx目录:<code>cd rpitx</code></li><li>然后输入rpitx自带的测试命令:<code>./easytest.sh</code></li><li>输入命令之后窗口会变成蓝色,首先需要输入发射的频率,我国FM收音机的能接受的频率在87.5~108之间,输入一个这段频率之间的、你本地没有其他电台占用的频率,回车即可。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141555065.png" alt="选择频率"></li><li>之后就进入选择发射方式的菜单了,按方向键选择“FmRds”的选项,按回车键确认。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141555703.png" alt="选择发射方式"></li><li>屏幕上就会显示出下面的界面,拿出收音机,调到刚刚输入的频率,试着听一下,是不是有一段男声播报”Pi FmFds”的测试语音啦?按空格键可以返回上层菜单,再按ESC键退出测试。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141555768.png" alt="正在发射"></li></ol><p>如果只持续了几秒,信号就断了,可以执行</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">sudo</span> rmmod w1-gpio<br></code></pre></td></tr></table></figure><p>但是这样发射的范围特别近,收音机离开树莓派一两米就没有信号了。这时候就可以拿出杜邦线,插在树莓派的GPIO 4引脚(图中7号引脚)实测加一段十几厘米的线能将发射范围拓展到两三间屋子,加到半米左右能覆盖大半层宿舍楼。但是要注意,范围不要太大,否则可能就违反无线电相关的法律条例了。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141555459.png" alt="树莓派引脚"></p><h2 id="使用rpitx播放音乐"><a href="#使用rpitx播放音乐" class="headerlink" title="使用rpitx播放音乐"></a>使用rpitx播放音乐</h2><p>rpitx支持直接播放WAV格式的音频,命令如下:</p><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs perl">sudo ./pifmrds -fre<span class="hljs-string">q [frequency]</span> -audio [filename.wav] <br></code></pre></td></tr></table></figure><p>比如你要在88.0MHZ进行发射,播放根目录下的music.wav文件,就可以输入命令:</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">sudo</span> ./pifmrds -freq <span class="hljs-number">88</span>.<span class="hljs-number">0</span> -audio /music.wav <br></code></pre></td></tr></table></figure><p>但是如果音乐的格式是MP3格式或者是其他格式呢?当然是可以事先转换成WAV格式的音频的,但这样太麻烦了。这时候就可以请出音频处理的瑞士军刀——sox了。</p><p>先安装sox,直接从包管理器中安装就可以:<code>sudo apt install sox libsox-fmt-all</code></p><p>安装完成后就可以使用如下的命令来实时转换MP3文件到WAV文件进行播放了,其中的”-“就是大名鼎鼎的Linux管道符了:</p><figure class="highlight excel"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs excel">sox -<span class="hljs-built_in">t</span> [format] [filename] -<span class="hljs-built_in">t</span> wav - | sudo ./pifmrds -freq XX -audio - <br></code></pre></td></tr></table></figure><p>比如你要在88.0MHZ进行发射,播放根目录下的music.mp3文件,就可以输入命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sox -t mp3 /music.mp3 -t wav - | sudo ./pifmrds -freq 88.0 -audio /music.wav <br></code></pre></td></tr></table></figure><p>播放的MP3文件不一定是本地的,网络上的MP3文件或者MP3的直播源(流)也是可以的,比如可以用sox+rpitx的组合发射法广或俄罗斯卫星广播电台的直播节目:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">sox -t mp3 https:<span class="hljs-regexp">//</span>rfienchinois64k.ice.infomaniak.ch<span class="hljs-regexp">/rfienchinois-64.mp3 -t wav - | sudo ./</span>pifmrds -freq <span class="hljs-number">80</span> -audio -sox -t mp3 http:<span class="hljs-regexp">//i</span>cecast-ruvr.cdnvideo.ru<span class="hljs-regexp">/rian.voicechi -t wav - | sudo ./</span>pifmrds -freq <span class="hljs-number">80</span> -audio - <br></code></pre></td></tr></table></figure><h2 id="使用rpitx播放网络串流"><a href="#使用rpitx播放网络串流" class="headerlink" title="使用rpitx播放网络串流"></a>使用rpitx播放网络串流</h2><p>上面简单提到了如何使用sox配合rpitx来发射MP3,并且可以直播发射一小部分格式为MP3音频流的直播串流。但是很多串流是M3U8格式的,并不是MP3音频流。这个时候可以请出来Linux上(Windows上也是啊Kora)的播放神器——VLC。</p><p>下面的步骤最好是先为树莓派设置VNC连接或Xrdp远程桌面连接,连接到树莓派的图形化界面上,操作会更加方便些。这里推荐这篇文章,可以作为参考:<a href="https://raspberrypi.club/322.html">如何在 Raspberry Pi 上安装 Xrdp Server (远程桌面) - 树莓派俱乐部</a></p><ol><li>使用VNC或远程桌面连接到树莓派。</li><li>先安装VLC,可以用apt命令行安装,也可以用图形化界面下的包管理器进行安装。</li><li>打开VLC,选择媒体菜单中的“流”并进入“打开媒体”对话框。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141555388.png" alt="VLC"></li><li>选择“网络”选项卡,在输入框中输入M3U8源地址,之后点击“串流”按钮,弹出“流输出”对话框。弹出的新对话框中,第一个“下一个”按钮直接点击即可。</li><li>在此之后的菜单中选择”HTTP”这一选项,点击”添加”按钮。之后的端口号和路径可以不进行修改(当然端口号如果被占用了当然要进行修改,下面的命令中也要同步修改),直接下一步即可。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141556484.png" alt="流输出对话框"></li><li>之后保持默认设置,配置文件为”Audio - MP3”,直接下一步,然后再点击”流”按钮,VLC这一部分就完成了。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141556410.png" alt="流输出对话框2"></li><li>再使用sox+rpitx的组合拳,把串流直播出来:</li></ol><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">sox -t mp3 http:<span class="hljs-regexp">//</span><span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">8080</span><span class="hljs-regexp">/ -t wav - | sudo ./</span>pifmrds -freq <span class="hljs-number">80</span> -audio - <br></code></pre></td></tr></table></figure><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141556855.png" alt="直播成功"></p><p>(上图中我换了一个端口号,因为8080被占用了.)现在打开收音机,听一听,是不是能听到清晰的直播节目了?</p><h2 id="采集树莓派系统声音-并使用rpitx实时发射"><a href="#采集树莓派系统声音-并使用rpitx实时发射" class="headerlink" title="采集树莓派系统声音 并使用rpitx实时发射"></a>采集树莓派系统声音 并使用rpitx实时发射</h2><p>下面将会简单介绍,如何采集树莓派系统声音,并使用rpitx实时发射。不管是在树莓派中打开音乐播放器播放的音乐,还是打开视频播放器播放视频的声音,还是浏览网页上网页的声音,都可以被实时采集并通过rpitx发射出去。</p><ol><li>先查看一下可以捕捉的声卡,使用命令:<code>pacmd list | grep ".monitor"</code>。如果命令行返回的是”没有 PulseAudio 守护进程在运行,或者没有作为会话守护进程运行“或者是相同含义的英语,那么就先执行一下 <code>pulseaudio --start &</code>,启动一下PulseAudio 守护进程,再重新执行这条命令。正常返回的截图如下,将画红线部分的monitor name复制下来备用,不同系统版本的树莓派可能会有一些差异:<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141556084.png" alt="获取monitor name"></li><li>进入rpitx文件夹,输入命令:</li></ol><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs perl">pacat --record -d [monitor_name] | sox -t raw -b <span class="hljs-number">16</span> -c <span class="hljs-number">2</span> -v <span class="hljs-number">1</span> -r <span class="hljs-number">44100</span> -L -e signed-integer - -t wav - | sudo ./pifmrds -fre<span class="hljs-string">q [frequency]</span> -audio - <br></code></pre></td></tr></table></figure><p>简单解释一下这一句长长的命令:其中,<code>[monitor_name]</code>就是第一步中我们得到的 <code>monitor name</code>,<code>[frequency]</code>是你想要发射的频率。sox命令后所跟的参数,-b代表采样的比特位数,-c代表声道的个数,-v代表转换音量的大小,-r代表采样率的多少。前面的-t代表是从raw格式进行转换,后面的-t代表转换成wav格式。当时研究出这条命令,花费了我足足半天的时间呢……</p><p>本文的标题里面还有一句“并进行直播”,这一部分就是对直播的简单实践。当然要直播自己的声音,或者直播其他设备上的声音,理论上也是可行的。有两种方案:</p><ol><li>购买一个USB声卡,安装好USB声卡的驱动后,连接好麦克风或者AUX输入,再从树莓派端进行采集和捕获。(推荐)</li><li>建立一个局域网内的直播服务器,使用其他设备进行收音并推流刀直播服务器,从树莓派上拉流进行直播。</li></ol><h2 id="模拟输入-采集其他设备的音频输出进行发射"><a href="#模拟输入-采集其他设备的音频输出进行发射" class="headerlink" title="模拟输入 采集其他设备的音频输出进行发射"></a>模拟输入 采集其他设备的音频输出进行发射</h2><ol><li>先查询一下当前系统中的声音输入设备:<code>pacmd list | grep "input"</code> 可以看到,有一个名叫 <code>alsa_input.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00.mono-fallback</code>的设备。复制设备的设备名称备用。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141556054.jpg" alt="input"></li><li>cd到rpitx的目录,执行上面提到的输出命令:</li></ol><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">pacat</span> --record -d alsa_input.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-<span class="hljs-number">00</span>.mono-fallback | sox -t raw -b <span class="hljs-number">16</span> -c <span class="hljs-number">2</span> -v <span class="hljs-number">1</span> -r <span class="hljs-number">44100</span> -L -e signed-integer - -t wav - | sudo ./pifmrds -freq <span class="hljs-number">100</span>.<span class="hljs-number">3</span> -audio - <br></code></pre></td></tr></table></figure><p>打开收音机,调整到正确的频率上,是不是能听到输出设备中的声音啦?部分输出设备的音量要调大一些才能取得不错的效果。另外根据声卡的好坏,会有些许延迟,这是正常情况。到此,用树莓派搭建自己的FM电台并进行直播这一终极目标终于实现,我们可以利用树莓派发射自己喜欢的节目咯。</p><h2 id="利用蓝牙-将其他设备的声音传送到树莓派上发射"><a href="#利用蓝牙-将其他设备的声音传送到树莓派上发射" class="headerlink" title="利用蓝牙 将其他设备的声音传送到树莓派上发射"></a>利用蓝牙 将其他设备的声音传送到树莓派上发射</h2><p>要想让其他设备能连接上树莓派,并且将音频信号传送给树莓派,首先得让其他设备认为树莓派是音频设备(比如蓝牙耳机),这样才能将音频输出切换到树莓派上,并自然的传送音频信号给树莓派进行发射了。实测可以将Android、IOS和Linux设备上的声音通过蓝牙传送到树莓派上,而Windows则提示“耳机已拔出”,一直没能成功。</p><ol><li>在树莓派上运行命令 <code>sudo hciconfig hci0 up</code> 打开树莓派的蓝牙。</li><li>执行命令 <code>sudo hciconfig hci0 class 0x200420</code> 这一步是将树莓派的蓝牙属性改为“音频设备”,这样就能让其他设备将树莓派识别成音频设备,乖乖的把音频流往树莓派上传送了。</li><li>执行命令 <code>hciconfig -a</code>,看看树莓派的蓝牙属性是否成功被修改了。没有成功的话,反复开关蓝牙,多尝试几次。正常的显示如下图:<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141556177.png" alt="树莓派显示"></li><li>进入树莓派桌面环境,蓝牙菜单在桌面右上角,开启树莓派和其他设备的蓝牙可发现,将树莓派和其他设备进行配对与连接。</li><li>连接成功,其他设备就能向树莓派传送音频啦!如下图。这时,在其他设备上随便播放一段音乐或者视频。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141556801.png" alt="音频输出"></li><li>查询一下当前树莓派中的声音输入设备:<code>pacmd list | grep "a2dp_source"</code> 可以看到,有一个名叫 <code>bluez_source.XX_XX_XX_XX_XX_XX.a2dp_source</code>的设备,具体名称跟其他设备的蓝牙MAC地址有关。复制设备的设备名称备用。<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/202401141556472.png" alt="树莓派显示"></li><li>cd到rpitx的目录,执行上面提到的输出命令:</li></ol><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">pacat</span> --record -d abluez_source.XX_XX_XX_XX_XX_XX.a2dp_source | sox -t raw -b <span class="hljs-number">16</span> -c <span class="hljs-number">2</span> -v <span class="hljs-number">1</span> -r <span class="hljs-number">44100</span> -L -e signed-integer - -t wav - | sudo ./pifmrds -freq <span class="hljs-number">100</span>.<span class="hljs-number">3</span> -audio - <br></code></pre></td></tr></table></figure><p>打开收音机,调整到正确的频率上,是不是能听到输出设备中的声音啦?</p><p>但是有一点不太好,其他设备上的音乐或者视频一旦暂停,就会停止向树莓派输出音频流,我们的发射也随之戛然而止。也就是只要一小会没有进程使用音频输出,其他设备就会暂停向树莓派输出音频流。怎么办呢?</p><p>让某个进程一直循环播放一段无声音频不就行了吗?没有其他进程播放音乐时,是一直占用着音频通道,因此就不会暂停输出音频流;当其他应用想要播放音频时,这个“守护进程”又没有声音,所以也不会影响到其他进程播放声音进行发射。当即用OBS录制了一段无声音频,效果杠杠的!这样,利用蓝牙,将其他设备的声音传送到树莓派上发射就完美了。</p><p>当然除此之外,rpitx还可以发射其他信号</p><h3 id="载波"><a href="#载波" class="headerlink" title="载波"></a>载波</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/Tunerpitx.png"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/Tunerpitx.png" alt="Carrier"></a> 一段产生于 434MHZ 的简单载波。</p><h3 id="啁啾"><a href="#啁啾" class="headerlink" title="啁啾"></a>啁啾</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/chirprpitx.png"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/chirprpitx.png" alt="Chirp"></a> 一段围绕434MHZ移动的载波。</p><h3 id="波谱"><a href="#波谱" class="headerlink" title="波谱"></a>波谱</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/spectrumrpitx.png"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/spectrumrpitx.png" alt="Spectrum"></a> SDR 上的瀑布上会显示一张图片。 请注意,您应该根据您的接收情况和您使用的 SDR 软件进行一些调整,以获得正确的对比度和尺寸。</p><h3 id="射频我的脸"><a href="#射频我的脸" class="headerlink" title="射频我的脸"></a>射频我的脸</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/rfmyface.png"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/rfmyface.png" alt="Rfmyface"></a> 使用 raspicam 对您的脸部进行波谱绘画,乐趣无穷!</p><h3 id="FM广播"><a href="#FM广播" class="headerlink" title="FM广播"></a>FM广播</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/fmrds.png"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/fmrds.png" alt="FMRDS"></a> 使用 RDS 广播 FM。 您可以通过 SDR 收到它。 这是可以在调频收音机或接收器上听到的调制,但这里频率太高。</p><h3 id="SSB单边带"><a href="#SSB单边带" class="headerlink" title="SSB单边带"></a>SSB单边带</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/ssbrpitx.png"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/ssbrpitx.png" alt="SSB"></a> 这是经典的业余无线电模拟语音调制。 使用 SDR在 USB 模式下。</p><h3 id="SSTV-慢扫描电视"><a href="#SSTV-慢扫描电视" class="headerlink" title="SSTV 慢扫描电视"></a>SSTV 慢扫描电视</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/sstvrpitx.JPG"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/sstvrpitx.JPG" alt="SSTV"></a> 这是一种使用音频调制的图像传输模式(USB模式)。 您需要一个额外的软件来解码和显示它(qsstv,msstv …)。 演示使用sstv的Martin1模式。</p><h3 id="Pocsag(寻呼机模式)"><a href="#Pocsag(寻呼机模式)" class="headerlink" title="Pocsag(寻呼机模式)"></a>Pocsag(寻呼机模式)</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/pocsagrpitx.JPG"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/pocsagrpitx.JPG" alt="pocsag"></a> 这是寻呼机使用的模式。 您需要额外的软件来解码。 将 SDR 设置为 NBFM 模式。</p><h3 id="Freedv(数字语音)"><a href="#Freedv(数字语音)" class="headerlink" title="Freedv(数字语音)"></a>Freedv(数字语音)</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/freedvrpitx.JPG"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/freedvrpitx.JPG" alt="freedv"></a> 这是最先进的开源数字调制。 您需要 Freedv 进行解调。</p><h3 id="Opera-信标台"><a href="#Opera-信标台" class="headerlink" title="Opera (信标台)"></a>Opera (<a href="https://baike.baidu.com/item/%E4%BF%A1%E6%A0%87%E5%8F%B0/5872163">信标台</a>)</h3><p><a href="https://github.com/F5OEO/rpitx/blob/master/doc/operarpitx.JPG"><img src="https://github.com/F5OEO/rpitx/raw/master/doc/operarpitx.JPG" alt="opera"></a> 这是一种听起来像莫尔斯电码的信标模式。 您需要模式 0.5 的 Opera模式 才能解码。</p><p>更多内容 可以看 <a href="">https://github.com/F5OEO/rpitx</a></p><p>参考</p><p><a href="https://blog.xmgspace.me/archives/set-up-fm-station-with-raspberry-pi.html">用树莓派搭建自己的FM电台并进行直播</a></p><p><a href="https://mabbs.github.io/2022/03/27/radio.html">用树莓派自制FM电台</a></p><p><a href="">https://github.com/ChristopheJacquet/PiFmRds/issues/161</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>树莓派</tag>
<tag>业余无线电</tag>
<tag>电台</tag>
</tags>
</entry>
<entry>
<title>国内开源镜像站点汇总</title>
<link href="/2023/12/30/%E5%9B%BD%E5%86%85%E5%BC%80%E6%BA%90%E9%95%9C%E5%83%8F%E7%AB%99%E7%82%B9%E6%B1%87%E6%80%BB/"/>
<url>/2023/12/30/%E5%9B%BD%E5%86%85%E5%BC%80%E6%BA%90%E9%95%9C%E5%83%8F%E7%AB%99%E7%82%B9%E6%B1%87%E6%80%BB/</url>
<content type="html"><![CDATA[<h2 id="一、站点版"><a href="#一、站点版" class="headerlink" title="一、站点版"></a>一、站点版</h2><h3 id="(一)、企业站"><a href="#(一)、企业站" class="headerlink" title="(一)、企业站"></a>(一)、企业站</h3><ol><li>网易:<a href="https://mirrors.163.com/">https://mirrors.163.com/</a></li><li>搜狐:<a href="http://mirrors.sohu.com/">http://mirrors.sohu.com/</a>(Ubuntu旧发行版同步被冻结,不同步Ubuntu新发行版,Ubuntu源同步正常)</li><li>阿里云:<a href="https://mirrors.aliyun.com/">https://mirrors.aliyun.com</a>(部分镜像同步延迟超过1天)</li><li>首都在线科技股份有限公司(英文名Capital Online Data Service):<a href="http://mirrors.yun-idc.com/">http://mirrors.yun-idc.com/</a></li><li>华为云:<a href="https://mirrors.huaweicloud.com/">https://mirrors.huaweicloud.com/</a></li><li>腾讯云:<a href="https://mirrors.cloud.tencent.com/">https://mirrors.cloud.tencent.com/</a></li><li>平安云:<a href="https://mirrors.pinganyun.com/">https://mirrors.pinganyun.com/</a></li></ol><h3 id="(二)、教育站"><a href="#(二)、教育站" class="headerlink" title="(二)、教育站"></a>(二)、教育站</h3><ol><li>中国科技大学:<a href="https://mirrors.ustc.edu.cn/">https://mirrors.ustc.edu.cn/</a>(当前已用容量估计:21.32T)</li><li>清华大学:<a href="https://mirrors.tuna.tsinghua.edu.cn/">https://mirrors.tuna.tsinghua.edu.cn/</a>(当前已用容量估计:9.8T)</li><li>北京外国语大学:<a href="http://mirrors.bfsu.edu.cn/">http://mirrors.bfsu.edu.cn/</a></li><li>北京交通大学:<a href="https://mirror.bjtu.edu.cn/">https://mirror.bjtu.edu.cn/</a></li><li>北京理工大学:<a href="http://mirror.bit.edu.cn/web/">http://mirror.bit.edu.cn/web/</a></li><li>兰州大学:<a href="http://mirror.lzu.edu.cn/">http://mirror.lzu.edu.cn/</a></li><li>上海交通大学:<a href="http://ftp.sjtu.edu.cn/">http://ftp.sjtu.edu.cn/</a>,<a href="ftp://ftp.sjtu.edu.cn/">ftp://ftp.sjtu.edu.cn/</a>(华东南地区教育网出口)</li><li>大连东软信息学院:<a href="http://mirrors.neusoft.edu.cn/">http://mirrors.neusoft.edu.cn/</a>(当前已用容量估计:2.5T)</li><li>浙江大学:<a href="http://mirrors.zju.edu.cn/">http://mirrors.zju.edu.cn/</a></li><li>重庆大学:<a href="http://mirrors.cqu.edu.cn/">http://mirrors.cqu.edu.cn/</a>(当前已用容量估计:3.93T)</li><li>南阳理工学院:<a href="http://mirror.nyist.edu.cn/">http://mirror.nyist.edu.cn/</a></li><li>中科院高能物理研究所:<a href="http://mirror.ihep.ac.cn/">http://mirror.ihep.ac.cn/</a>,<a href="http://mir-cern.ihep.ac.cn/">http://mir-cern.ihep.ac.cn/</a></li><li>电子科技大学凝聚网络安全工作室:<a href="http://mirrors.cnssuestc.org/">http://mirrors.cnssuestc.org/</a></li><li>西北农林科技大学:<a href="https://mirrors.nwafu.edu.cn/">https://mirrors.nwafu.edu.cn/</a>,<a href="https://mirrors.nwsuaf.edu.cn/">https://mirrors.nwsuaf.edu.cn/</a></li><li>郑州大学:<a href="https://mirrors.zzu.edu.cn/">https://mirrors.zzu.edu.cn/</a></li><li>南京信息工程大学:<a href="http://mirrors.duohuo.org/">http://mirrors.duohuo.org/</a></li><li>华中科技大学:<a href="http://mirror.hust.edu.cn/">http://mirror.hust.edu.cn/</a>(华中地区教育网出口,当前已用容量估计:4.83T)</li><li>重庆邮电大学:<a href="http://mirrors.cqupt.edu.cn/">http://mirrors.cqupt.edu.cn/</a><a href="https://mirror.redrock.team/">https://mirror.redrock.team/</a>(当前已用容量估计:1.68T)</li><li>大连理工大学:<a href="http://mirror.dlut.edu.cn/">http://mirror.dlut.edu.cn/</a>(大连地区教育网出口)</li><li>江苏开放大学:<a href="http://mirrors.jstvu.edu.cn/">http://mirrors.jstvu.edu.cn/</a></li><li>山东女子学院:<a href="http://mirrors.sdwu.edu.cn/">http://mirrors.sdwu.edu.cn/</a></li><li>西安交通大学:<a href="https://mirrors.xjtu.edu.cn/">https://mirrors.xjtu.edu.cn/</a>(西北地区教育网出口)</li><li>西安电子科技大学:<a href="https://linux.xidian.edu.cn/mirrors/">https://linux.xidian.edu.cn/mirrors/</a>(镜像仅供校内使用)</li><li>南开大学:<a href="http://ftp.nankai.edu.cn/">http://ftp.nankai.edu.cn/</a>(镜像仅供校内使用)</li><li>天津大学:<a href="http://mirror.tju.edu.cn/">http://mirror.tju.edu.cn</a>(镜像仅供校内使用,另一域名为zyrj.org)</li><li>南京师范大学:<a href="http://mirrors.njnu.edu.cn/">http://mirrors.njnu.edu.cn/</a>(镜像仅供校内使用)</li><li>电子科技大学:<a href="http://ubuntu.uestc.edu.cn/">http://ubuntu.uestc.edu.cn/</a>(西南地区教育网出口西南,首页近一年无人维护,内容可访问)</li><li>中央音乐学院:<a href="http://fundawang.lcuc.org.cn/">http://fundawang.lcuc.org.cn/</a>(镜像仅供校内使用)</li><li>云南大学:<a href="http://mirrors.ynuosa.org/index/">http://mirrors.ynuosa.org/index/</a>(镜像站列表),<a href="http://pypi.opensource.ynu.edu.cn/">http://pypi.opensource.ynu.edu.cn/</a>(收录pypi)</li><li>上海科技大学:<a href="https://mirrors-wan.geekpie.org/">https://mirrors-wan.geekpie.org/</a></li><li>南京信息职业技术学院:<a href="https://mirrors.njcit.cn/">https://mirrors.njcit.cn/</a></li><li>上海交通大学SJTUG: <del><a href="http://mirrors.sjtug.org/">http://mirrors.sjtug.org/</a></del> (已关闭) <a href="https://mirrors.sjtug.sjtu.edu.cn/">https://mirrors.sjtug.sjtu.edu.cn/</a></li><li>南京邮电大学通达学院:<a href="http://mirrors.tdsast.cn/">http://mirrors.tdsast.cn/</a></li><li>燕山大学:<a href="http://mirror.pret-page.com/">http://mirror.pret-page.com/</a></li><li>南京邮电大学:<a href="http://mirrors.njupt.edu.cn/">http://mirrors.njupt.edu.cn/</a></li><li>南京大学:<a href="http://mirrors.nju.edu.cn/">http://mirrors.nju.edu.cn/</a></li><li>上海大学:<a href="https://mirrors.shu.edu.cn/">https://mirrors.shu.edu.cn/</a></li><li>青岛科技大学:<a href="http://mirrors.qust.edu.cn/">http://mirrors.qust.edu.cn/</a>(镜像仅供校内使用)</li><li>同济大学:<a href="https://mirrors.tongji.edu.cn/">https://mirrors.tongji.edu.cn/</a></li><li>华南农业大学:<a href="https://mirrors.scau.edu.cn/">https://mirrors.scau.edu.cn/</a></li><li>东莞理工学院:<a href="https://mirrors.dgut.edu.cn/">https://mirrors.dgut.edu.cn/</a></li><li>哈尔滨工业大学:<a href="http://run.hit.edu.cn/html/">http://run.hit.edu.cn/html/</a></li></ol><h3 id="(三)、其他"><a href="#(三)、其他" class="headerlink" title="(三)、其他"></a>(三)、其他</h3><ol><li>中国电信天翼云:<a href="http://mirrors.ctyun.cn/">http://mirrors.ctyun.cn/</a></li><li>常州贝特康姆软件技术有限公司(公云PubYun):<a href="http://centos.bitcomm.cn/">http://centos.bitcomm.cn/</a>,<a href="http://mirrors.pubyun.com/">http://mirrors.pubyun.com/</a>(当前已用容量估计:2.3T)</li><li>开源镜像文件搜索:<a href="http://mirrors.org.cn/">http://mirrors.org.cn/</a>(只能搜索和浏览,不能下载)</li><li>Linux运维派:<a href="https://mirrors.skyshe.cn/">https://mirrors.skyshe.cn/</a>(使用阿里云服务器,界面使用浙江大学的模板,首页维护,内容可访问)</li><li>北京鹏博士宽带:<a href="http://mirrors.btte.net/">http://mirrors.btte.net/</a>(只收录CentOS)</li><li>Fayea工作室:<a href="http://apache.fayea.com/">http://apache.fayea.com/</a>(只收录Apache镜像,当前已用容量估计:120GB)</li><li>豆瓣pypi:<a href="http://pypi.doubanio.com/">http://pypi.doubanio.com/</a>,<a href="https://pypi.doubanio.com/">https://pypi.doubanio.com/</a></li><li>v2ex的pypi:<a href="http://pypi.v2ex.com/">http://pypi.v2ex.com/</a>(首页有https异常NET::ERR_CERT_COMMON_NAME_INVALID)</li><li>淘宝NPM:<a href="https://npm.taobao.org/">https://npm.taobao.org/</a></li><li>Ruby China的RubyGems:<a href="https://gems.ruby-china.org/">https://gems.ruby-china.org/</a></li><li>淘宝TAEMaven仓库镜像:<a href="http://mvnrepo.tae.taobao.com/content/groups/public/">http://mvnrepo.tae.taobao.com/content/groups/public/</a></li><li>阿里云Maven仓库镜像:<a href="http://maven.aliyun.com/nexus/content/groups/public">http://maven.aliyun.com/nexus/content/groups/public</a></li><li>阿里云Jcenter仓库镜像:<a href="http://maven.aliyun.com/nexus/content/repositories/jcenter/">http://maven.aliyun.com/nexus/content/repositories/jcenter/</a></li><li>LinuxEye:<a href="http://mirrors.linuxeye.com/">http://mirrors.linuxeye.com/</a></li><li>移动云镜像站:<a href="http://mirrors.bclinux.org/">http://mirrors.bclinux.org/</a></li><li>Cloud-Stack镜像站:<a href="http://mirrors.cloudstack-china.com/">http://mirrors.cloudstack-china.com/</a></li><li>cn99(常州贝特康姆旗下):<a href="http://mirrors.cn99.com/">http://mirrors.cn99.com/</a></li><li>龙芯开源社区:<a href="http://mirrors.loongnix.org/">http://mirrors.loongnix.org/</a>(只收录龙芯镜像)</li><li>黔东南开源镜像站:<a href="https://mirrors.gzqdn.org/">https://mirrors.gzqdn.org/</a>(https证书过期,没有设置定时更新脚本)</li><li>联创团队:<a href="https://mirrors.hustunique.com/">https://mirrors.hustunique.com/</a></li><li>英荔教育:<a href="https://mirrors.e-ducation.cn/">https://mirrors.e-ducation.cn/</a></li></ol><h3 id="(四)、确认关闭的镜像站"><a href="#(四)、确认关闭的镜像站" class="headerlink" title="(四)、确认关闭的镜像站"></a>(四)、确认关闭的镜像站</h3><ol><li>北京航空航天大学:<a href="http://mirror.buaa.edu.cn/">http://mirror.buaa.edu.cn/</a>,<a href="http://mirror.buaabt.cn/">http://mirror.buaabt.cn/</a>(2012年建立,2014年关闭。镜像站关闭后不久,未来花园BT关闭。)</li><li>青岛大学:<a href="http://mirror.qdu.edu.cn/">http://mirror.qdu.edu.cn/</a>,<a href="https://mirror.osqdu.org/">https://mirror.osqdu.org/</a>(2009年建立,2012年关闭,OSQDU主要管理人员无法继续维护)</li><li>炼数成金Apache镜像:<a href="http://apache.dataguru.cn/">http://apache.dataguru.cn/</a>(2016年关闭)</li><li>猫扑Apache镜像:<a href="http://labs.mop.com/apache-mirror/">http://labs.mop.com/apache-mirror/</a>(2016年关闭)</li><li>人人网Apache镜像:<a href="http://labs.renren.com/apache-mirror/">http://labs.renren.com/apache-mirror/</a>(2016年关闭)</li><li>开源中国社区:<a href="http://mirrors.oss.org.cn/">http://mirrors.oss.org.cn/</a>,<a href="http://mirrors.oschina.net/">http://mirrors.oschina.net/</a>(2015年关闭)</li><li>希网网络cn99:<a href="http://ubuntu.cn99.com/">http://ubuntu.cn99.com/</a>(域名CNAME跳转到网易镜像,2016年9月重建)</li><li>ZMX - IT技术交流论坛:<a href="http://mirrors.itzmx.com/">http://mirrors.itzmx.com/</a>(域名跳转到清华镜像)</li><li>中国科学院:<a href="http://www.opencas.org/mirrors/">http://www.opencas.org/mirrors/</a>(2016年5月关闭)</li><li>电子科技大学LUG镜像:<a href="http://mirrors.uestc.xyz/">http://mirrors.uestc.xyz/</a>(2016年4月关闭)</li><li>北京邮电大学:<a href="ftp://ftp.bupt.edu.cn/pub/mirror/">ftp://ftp.bupt.edu.cn/pub/mirror/</a>(2016年9月关闭,清空FTP)</li><li>西南大学:<a href="http://mirrors.linuxstory.org/">http://mirrors.linuxstory.org/</a>,<a href="http://mirrors.swu.edu.cn/">http://mirrors.swu.edu.cn/</a>(2016年6月关闭)</li><li>电子科技大学星辰工作室:<a href="http://mirrors.stuhome.net/">http://mirrors.stuhome.net/</a>(2016年8月关闭)</li><li>noc.im:<a href="http://mirrors.noc.im/">http://mirrors.noc.im/</a>(2016年8月关闭)</li><li>LUPA:<a href="http://mirror.lupaworld.com/">http://mirror.lupaworld.com/</a>(2016年停止同步,无实质内容)</li><li>远景:<a href="http://mirror.pcbeta.com/">http://mirror.pcbeta.com/</a>(2016年6月关闭)</li><li>山东理工大学:<a href="http://ruby.sdutlinux.org/">http://ruby.sdutlinux.org/</a>(2016年9月关闭)</li><li>新浪:<a href="http://mirrors.sina.cn/">http://mirrors.sina.cn/</a>,<a href="http://mirrors.sina.com/">http://mirrors.sina.com/</a>(只收录CentOS,2015年3月上线,2016年10月关闭)</li><li>中国地质大学:<a href="http://mirrors.cug.edu.cn/">http://mirrors.cug.edu.cn/</a>(2016年11月关闭)</li><li>北京化工大学:<a href="http://ubuntu.buct.edu.cn/">http://ubuntu.buct.edu.cn/</a>(2016年11月关闭)</li><li>中国互联网络信息中心:<a href="http://mirrors.cnnic.cn/">http://mirrors.cnnic.cn/</a>(只收录Apache镜像,2017年4月关闭,重定向到清华大学)</li><li>腾讯Bugly:<a href="http://android-mirror.bugly.qq.com:8080/">http://android-mirror.bugly.qq.com:8080/</a>(只收录Apache镜像,2017年4月关闭)</li><li>海波网络镜像:<a href="http://mirrors.hypo.cn/">http://mirrors.hypo.cn/</a>(2017年5月关闭)</li><li>吉林大学:<a href="http://mirrors.jlu.edu.cn/">http://mirrors.jlu.edu.cn/</a>(2017年10月关闭)</li><li>厦门大学:<a href="http://mirrors.xmu.edu.cn/">http://mirrors.xmu.edu.cn/</a>(无实质内容)</li><li>中山大学:<a href="http://mirror.sysu.edu.cn/">http://mirror.sysu.edu.cn/</a>(无法访问)</li><li>东北大学:<a href="http://mirror.neu.edu.cn/">http://mirror.neu.edu.cn/</a>(2017年后接近无人维护状态)</li></ol><h2 id="二、软件版"><a href="#二、软件版" class="headerlink" title="二、软件版"></a>二、软件版</h2><h3 id="(一)、操作系统类"><a href="#(一)、操作系统类" class="headerlink" title="(一)、操作系统类"></a>(一)、操作系统类</h3><ol><li>Ubuntu<ul><li>网易:<a href="http://mirrors.163.com/ubuntu-releases/">http://mirrors.163.com/ubuntu-releases/</a></li><li>首都在线科技股份有限公司:<a href="http://mirrors.yun-idc.com/ubuntu-releases/">http://mirrors.yun-idc.com/ubuntu-releases/</a></li><li>阿里云:<a href="http://mirrors.aliyun.com/ubuntu-releases/">http://mirrors.aliyun.com/ubuntu-releases/</a></li></ul></li><li>Centos<ul><li>网易:<a href="http://mirrors.163.com/centos/">http://mirrors.163.com/centos/</a></li><li>搜狐:<a href="http://mirrors.sohu.com/centos/">http://mirrors.sohu.com/centos/</a></li><li>阿里云:<a href="http://mirrors.aliyun.com/centos/">http://mirrors.aliyun.com/centos/</a></li></ul></li><li>Centos-vault (Centos的旧发行版源)<ul><li>阿里云:<a href="http://mirrors.aliyun.com/centos-vault/">http://mirrors.aliyun.com/centos-vault/</a></li><li>清华大学:<a href="https://mirror.tuna.tsinghua.edu.cn/centos-vault/">https://mirror.tuna.tsinghua.edu.cn/centos-vault/</a></li><li>南京大学:<a href="http://mirrors.nju.edu.cn/centos-vault/">http://mirrors.nju.edu.cn/centos-vault/</a></li></ul></li><li>树莓派Raspbian<ul><li>搜狐:<a href="http://mirrors.sohu.com/raspbian/">http://mirrors.sohu.com/raspbian/</a></li><li>中国科技大学:<a href="http://mirrors.ustc.edu.cn/raspbian/">http://mirrors.ustc.edu.cn/raspbian/</a></li><li>浙江大学:<a href="http://mirrors.zju.edu.cn/raspbian/">http://mirrors.zju.edu.cn/raspbian/</a></li><li>重庆大学:<a href="http://mirrors.cqu.edu.cn/raspbian/">http://mirrors.cqu.edu.cn/raspbian/</a></li><li>郑州大学:<a href="http://mirrors.zzu.edu.cn/raspbian/">http://mirrors.zzu.edu.cn/raspbian/</a></li><li>吉林大学:<a href="http://mirrors.jlu.edu.cn/raspbian/">http://mirrors.jlu.edu.cn/raspbian/</a></li></ul></li></ol><h3 id="(二)、服务器类"><a href="#(二)、服务器类" class="headerlink" title="(二)、服务器类"></a>(二)、服务器类</h3><ol><li>Tomcat、Apache<ul><li>清华大学:<a href="https://mirrors.tuna.tsinghua.edu.cn/apache/">https://mirrors.tuna.tsinghua.edu.cn/apache/</a></li><li>北京理工大学:<a href="http://mirror.bit.edu.cn/apache/">http://mirror.bit.edu.cn/apache/</a></li></ul></li><li>Nginx<ul><li>搜狐:<a href="http://mirrors.sohu.com/nginx/">http://mirrors.sohu.com/nginx/</a></li></ul></li><li>MySQL<ul><li>网易163:<a href="http://mirrors.163.com/mysql/Downloads/">http://mirrors.163.com/mysql/Downloads/</a></li><li>搜狐:<a href="http://mirrors.sohu.com/mysql/">http://mirrors.sohu.com/mysql/</a></li><li>USTC:<a href="http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/">http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/</a></li><li>北京理工大学:<a href="http://mirror.bit.edu.cn/mysql/Downloads/">http://mirror.bit.edu.cn/mysql/Downloads/</a></li><li>中国电信天翼云:<a href="http://mirrors.ctyun.cn/Mysql/">http://mirrors.ctyun.cn/Mysql/</a></li></ul></li><li>PostgreSQL<ul><li>浙江大学:<a href="http://mirrors.zju.edu.cn/postgresql/">http://mirrors.zju.edu.cn/postgresql/</a></li></ul></li><li>MariaDB<ul><li>中国电信天翼云:<a href="http://mirrors.ctyun.cn/MariaDB/">http://mirrors.ctyun.cn/MariaDB/</a></li></ul></li><li>mongodb<ul><li>阿里云:<a href="http://mirrors.aliyun.com/mongodb/">http://mirrors.aliyun.com/mongodb/</a></li><li>清华大学:<a href="https://mirrors.tuna.tsinghua.edu.cn/mongodb/">https://mirrors.tuna.tsinghua.edu.cn/mongodb/</a></li></ul></li><li>VideoLAN<ul><li>大连东软信息学院:<a href="http://mirrors.neusoft.edu.cn/videolan/">http://mirrors.neusoft.edu.cn/videolan/</a></li><li>中国科技大学:<a href="http://mirrors.ustc.edu.cn/videolan-ftp/">http://mirrors.ustc.edu.cn/videolan-ftp/</a></li></ul></li></ol><h3 id="(三)、开发工具类"><a href="#(三)、开发工具类" class="headerlink" title="(三)、开发工具类"></a>(三)、开发工具类</h3><ol><li><p>eclipse</p><ul><li>大连东软信息学院:<a href="http://mirrors.neusoft.edu.cn/eclipse/technology/epp/downloads/release/">http://mirrors.neusoft.edu.cn/eclipse/technology/epp/downloads/release/</a>(推荐,维护及时)</li><li>中国科技大学:<a href="http://mirrors.ustc.edu.cn/eclipse/technology/epp/downloads/release/">http://mirrors.ustc.edu.cn/eclipse/technology/epp/downloads/release/</a></li><li>北京理工大学:<a href="http://mirror.bit.edu.cn/eclipse/technology/epp/downloads/release/">http://mirror.bit.edu.cn/eclipse/technology/epp/downloads/release/</a></li></ul></li><li><p>安卓SDK</p><ul><li>大连东软信息学院:<a href="http://mirrors.neusoft.edu.cn/android/repository/">http://mirrors.neusoft.edu.cn/android/repository/</a></li><li>郑州大学:<a href="http://mirrors.zzu.edu.cn/android/repository/">http://mirrors.zzu.edu.cn/android/repository/</a>(2016年4月停止同步,2016年10月重新同步)</li><li>南阳理工学院:<a href="http://mirror.nyist.edu.cn/android/repository/">http://mirror.nyist.edu.cn/android/repository/</a>(停止同步)</li></ul></li><li><p>安卓源码AOSP</p><ul><li>清华大学:<a href="https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/">https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/</a></li><li>中国科技大学:<a href="https://lug.ustc.edu.cn/wiki/mirrors/help/aosp">https://lug.ustc.edu.cn/wiki/mirrors/help/aosp</a></li></ul></li><li><p>Docker Hub</p><ul><li>网易蜂巢:<a href="https://c.163.com/#/m/home/">https://c.163.com/#/m/home/</a></li><li>灵雀云:<a href="https://hub.alauda.cn/">https://hub.alauda.cn/</a></li><li>DaoCloud:<a href="https://hub.daocloud.io/">https://hub.daocloud.io/</a></li><li>时速云:<a href="https://hub.tenxcloud.com/">https://hub.tenxcloud.com/</a></li><li>阿里云:<a href="https://dev.aliyun.com/search.html">https://dev.aliyun.com/search.html</a></li></ul></li><li><p>GitLab-CE</p><ul><li>清华大学:<a href="https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/">https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/</a></li><li>浙江大学:<a href="http://www.lupaworld.com/article-257568-1.html">http://www.lupaworld.com/article-257568-1.html</a></li></ul></li><li><p>PyPi</p><ul><li>豆瓣:<a href="https://pypi.doubanio.com/simple">https://pypi.doubanio.com/simple</a></li><li>阿里云:<a href="https://mirrors.aliyun.com/pypi/simple/">https://mirrors.aliyun.com/pypi/simple/</a></li><li>中国科学技术大学:<a href="https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/">https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/</a></li><li>清华大学:<a href="https://pypi.tuna.tsinghua.edu.cn/simple/">https://pypi.tuna.tsinghua.edu.cn/simple/</a></li></ul></li></ol><h2 id="三、官方镜像列表状态地址"><a href="#三、官方镜像列表状态地址" class="headerlink" title="三、官方镜像列表状态地址"></a>三、官方镜像列表状态地址</h2><ul><li>CentOS:<a href="http://mirror-status.centos.org/#cn">http://mirror-status.centos.org/#cn</a></li><li>Archlinux:<a href="https://www.archlinux.org/mirrors/status/">https://www.archlinux.org/mirrors/status/</a></li><li>Gentoo:<a href="https://www.gentoo.org/downloads/mirrors/#CN">https://www.gentoo.org/downloads/mirrors/#CN</a></li><li>Ubuntu CD:<a href="https://launchpad.net/ubuntu/+cdmirrors">https://launchpad.net/ubuntu/+cdmirrors</a></li><li>Ubuntu软件源:<a href="https://launchpad.net/ubuntu/+archivemirrors">https://launchpad.net/ubuntu/+archivemirrors</a></li><li>Debian:<a href="https://www.debian.org/mirror/list">https://www.debian.org/mirror/list</a>,<a href="https://www.debian.org/mirror/list.en.html">https://www.debian.org/mirror/list.en.html</a>,<a href="http://mirror.debian.org/status.html">http://mirror.debian.org/status.html</a></li><li>Linux Mint:<a href="https://linuxmint.com/mirrors.php">https://linuxmint.com/mirrors.php</a></li><li>Fedora Linux/Fedora EPEL:<a href="https://admin.fedoraproject.org/mirrormanager/mirrors">https://admin.fedoraproject.org/mirrormanager/mirrors</a></li><li>openSUSE:<a href="http://mirrors.opensuse.org/">http://mirrors.opensuse.org/</a></li><li>PackMan:<a href="http://packman.links2linux.org/mirrors">http://packman.links2linux.org/mirrors</a></li><li>FreeBSD:<a href="https://www.freebsd.org/doc/handbook/mirrors-ftp.html#mirrors-cn-ftp">https://www.freebsd.org/doc/handbook/mirrors-ftp.html#mirrors-cn-ftp</a></li><li>Apache:<a href="http://www.apache.org/mirrors/#cn">http://www.apache.org/mirrors/#cn</a></li><li>Cygwin:<a href="https://www.cygwin.com/mirrors.html">https://www.cygwin.com/mirrors.html</a></li><li>CRAN:<a href="https://cran.r-project.org/mirrors.html">https://cran.r-project.org/mirrors.html</a></li><li>CTAN:<a href="http://www.ctan.org/mirrors/">http://www.ctan.org/mirrors/</a>,<a href="http://www.ctan.org/mirrors/mirmon#cn">http://www.ctan.org/mirrors/mirmon#cn</a></li><li>CPAN:<a href="http://www.cpan.org/SITES.html">http://www.cpan.org/SITES.html</a></li><li>Ruby:<a href="https://www.ruby-lang.org/en/downloads/mirrors/">https://www.ruby-lang.org/en/downloads/mirrors/</a></li><li>树莓派Raspbian:<a href="http://www.raspbian.org/RaspbianMirrors">http://www.raspbian.org/RaspbianMirrors</a></li><li>深度操作系统deepin:<a href="https://www.deepin.org/mirrors/releases/">https://www.deepin.org/mirrors/releases/</a></li><li>Scientific Linux:<a href="https://www.scientificlinux.org/downloads/sl-mirrors/">https://www.scientificlinux.org/downloads/sl-mirrors/</a></li><li>Sabayon Linux:<a href="http://www.sabayon.org/download/">http://www.sabayon.org/download/</a></li><li>MySQL:<a href="http://dev.mysql.com/downloads/mirrors/">http://dev.mysql.com/downloads/mirrors/</a></li><li>KNOPPIX:<a href="http://www.knopper.net/knoppix-mirrors/">http://www.knopper.net/knoppix-mirrors/</a></li><li>QT:<a href="http://download.qt.io/static/mirrorlist/">http://download.qt.io/static/mirrorlist/</a></li><li>VideoLAN:<a href="http://www.videolan.org/videolan/mirrors.html">http://www.videolan.org/videolan/mirrors.html</a></li><li>eclipse:<a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/luna/SR2/eclipse-java-luna-SR2-win32.zip&format=xml">http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/luna/SR2/eclipse-java-luna-SR2-win32.zip&format=xml</a></li><li>repoforge:<a href="http://mirror-status.repoforge.org/#cn">http://mirror-status.repoforge.org/#cn</a></li><li>Jenkins:<a href="http://mirrors.jenkins-ci.org/status.html#CN">http://mirrors.jenkins-ci.org/status.html#CN</a></li><li>MariaDB:<a href="https://mariadb.com/kb/en/mirror-sites-for-mariadb/">https://mariadb.com/kb/en/mirror-sites-for-mariadb/</a></li></ul><h2 id="四、几个官方cn子域解析"><a href="#四、几个官方cn子域解析" class="headerlink" title="四、几个官方cn子域解析"></a>四、几个官方cn子域解析</h2><ul><li>FreeBSD:<a href="ftp://ftp.cn.freebsd.org/">ftp://ftp.cn.freebsd.org/</a><–><a href="ftp://www.freebsdchina.org/">ftp://www.freebsdchina.org/</a>FreeBSD China</li><li>Debian:<a href="http://ftp.cn.debian.org/">http://ftp.cn.debian.org/</a><–><a href="https://mirrors.ustc.edu.cn/debian/">https://mirrors.ustc.edu.cn/debian/</a>中国科学技术大学</li><li>Debian:<a href="http://ftp2.cn.debian.org/">http://ftp2.cn.debian.org/</a><–><a href="https://mirror.tuna.tsinghua.edu.cn/debian/">https://mirror.tuna.tsinghua.edu.cn/debian/</a>清华大学</li></ul><h2 id="五、镜像站搭建参考"><a href="#五、镜像站搭建参考" class="headerlink" title="五、镜像站搭建参考"></a>五、镜像站搭建参考</h2><ol><li>清华大学镜像管理器脚本,<a href="https://github.com/tuna/tunasync">https://github.com/tuna/tunasync</a></li><li>搭建开源镜像站-FPs,<a href="http://fangpeishi.github.io/build_opensource_mirror.html">http://fangpeishi.github.io/build_opensource_mirror.html</a></li><li>科大开源软件镜像是怎样炼成的,<a href="https://ring0.me/2013/09/how-ustc-mirror-works/">https://ring0.me/2013/09/how-ustc-mirror-works/</a></li><li>北京交通大学同步脚本,<a href="https://github.com/ideal/mirror">https://github.com/ideal/mirror</a></li><li>中国科学院同步脚本,<a href="https://github.com/opencas/mirrors">https://github.com/opencas/mirrors</a></li><li>浙江大学同步脚本,<a href="https://github.com/zjulug">https://github.com/zjulug</a>,<a href="https://github.com/ZJU-NewMirrors">https://github.com/ZJU-NewMirrors</a></li><li>重庆邮电大学同步脚本,<a href="https://github.com/CQUPTMirror">https://github.com/CQUPTMirror</a></li><li>兰州大学同步脚本,<a href="https://github.com/LZUOSS/Mirror">https://github.com/LZUOSS/Mirror</a></li><li>教育网主干节点分布,<a href="http://www.cernet.com/aboutus/gyce_jgsz.htm">http://www.cernet.com/aboutus/gyce_jgsz.htm</a></li><li>教育网CERNET八大主干节点及地区节点,<a href="http://blog.csdn.net/gsls200808/article/details/75099728">http://blog.csdn.net/gsls200808/article/details/75099728</a></li><li>教育网41核心节点,<a href="http://www.cernet20.edu.cn/family.shtml">http://www.cernet20.edu.cn/family.shtml</a></li></ol><h2 id="六、镜像站异动情况"><a href="#六、镜像站异动情况" class="headerlink" title="六、镜像站异动情况"></a>六、镜像站异动情况</h2><ul><li>2016-11-13:新浪镜像站全网无法访问,由<a href="http://www.17ce.com/site/http/201611_026c9958e669fab697baa0520bbaf652.html">17ce</a> 提供测试结果</li><li>2016-11-13:北京交通大学镜像首页访问出现403Forbidden</li><li>2016-11-13:哈尔滨工业大学镜像目录被清空</li><li>2016-11-13:中国地质大学镜像站全网无法访问,由<a href="http://www.17ce.com/site/http/201611_2efa53aec3a780c57af46371b02ffeab.html">17ce</a>提供测试结果</li><li>2016-11-13:北京化工大学镜像站全网无法访问,由<a href="http://www.17ce.com/site/http/201611_39d1dd7415483b5256fc6dfe9481bcc5.html">17ce</a>提供测试结果</li><li>2016-11-13:云南大学pypi镜像地址无法访问</li><li>2016-11-13:Linux运维派镜像首页访问出现404</li><li>2016-11-26:新浪镜像站截至目前已经失联51天,移至关闭列表</li><li>2016-11-26:首都在线移至企业站列表,首都在线是国内的一家主机商,有国内节点和海外节点</li><li>2016-12-10:哈尔滨工业大学镜像目录截至目前已经超过一个月无法访问,移至关闭列表</li><li>2017-1-5:北京化工大学镜像截至目前已经超过两个月无法访问,移至关闭列表</li><li>2017-1-5:中国地质大学镜像截至目前已经超过两个月无法访问,移至关闭列表</li><li>2017-1-5:新增南京信息职业技术学院镜像,这个镜像在2016年11上线</li><li>2017-1-5:新增龙芯开源社区镜像,这个镜像应该是很早(2015年之前)就建立了只是不对外,目前只更新龙芯镜像</li><li>2017-1-6:新增上海交通大学SJTUG镜像,据v2ex上的消息,这个镜像于2016年上线用来替代原来的上海交通大学镜像,不过目前这个镜像的发展情况也不乐观</li><li>2017-5-17:cnnic镜像,腾讯bugly镜像于2017年4月关闭</li><li>2017-5-17:海波镜像于2017年5月关闭,新增南京邮电大学通达学院、燕山大学、黔东南开源镜像站3个镜像</li><li>2017-5-17:新增南京邮电大学镜像</li><li>2018-1-19:ubuntu的cn子域cn.archive.ubuntu.com不再指向阿里云,改为指向美国IP(91.189.91.26)(18号DNS切换,全网无法正确解析)</li><li>2018-5-16:更新上海交通大学SJTUG镜像,新地址已经包含了原先的ftp.sjtu.edu.cn大多数镜像,且新增了大量现代源</li><li>2020-11-2:清华大学和中国科技大学11月30日接到热心用户投诉,移除了deepin软件源,原因是设计商业软件重分发授权。参见:<a href="https://bbs.deepin.org/post/204649">https://bbs.deepin.org/post/204649</a></li><li>2020-11-2:东北大学镜像通过近两年来的访问监测,2017年后无更新内容,移动到关闭列表。</li><li>2020-11-17:哈尔滨工业大学镜像重开</li></ul>]]></content>
<categories>
<category>资源</category>
</categories>
<tags>
<tag>开源</tag>
<tag>镜像</tag>
</tags>
</entry>
<entry>
<title>code-server Dokcer部署方法及踩坑</title>
<link href="/2023/12/28/code-serverDokcer%E9%83%A8%E7%BD%B2%E6%96%B9%E6%B3%95%E5%8F%8A%E8%B8%A9%E5%9D%91/"/>
<url>/2023/12/28/code-serverDokcer%E9%83%A8%E7%BD%B2%E6%96%B9%E6%B3%95%E5%8F%8A%E8%B8%A9%E5%9D%91/</url>
<content type="html"><![CDATA[<p>简介<br>code-server是一款服务端的vscode,可以在浏览器中使用vscode</p><p>官网:code-server</p><p>安装<br>官方提供的安装方法:<a href="https://coder.com/docs/code-server/latest/install">https://coder.com/docs/code-server/latest/install</a></p><p>官方提供了许多的安装方式,这里为了方便快捷,我们使用Docker部署,Docker Hub。官方镜像支持 amd64 和 arm64,如果需要arm32,可以使用社区版镜像<a href="https://hub.docker.com/r/linuxserver/code-server%E3%80%82%E8%BF%99%E9%87%8C%E6%88%91%E4%BB%AC%E4%BD%BF%E7%94%A8%E5%AE%98%E6%96%B9%E9%95%9C%E5%83%8F%E3%80%82">https://hub.docker.com/r/linuxserver/code-server。这里我们使用官方镜像。</a></p><p>在官网中Docker安装的方法中,映射了以下两个目录:</p><p>/home/coder/.config:code-server的配置文件,里面包含了登录密码。容器第一次启动时如果.config文件夹为空,会自动创建配置文件,docker的启动日志中可以查看。具体配置文件为/home/coder/.config/code-server/config.yaml<br>/home/coder/project:code-server默认提供的工程目录,映射在物理机方便用户修改查看,当然你也可以映射自己的目录。<br>自动创建的config.yaml文件会包含密码。密码是自动生成的,可以自己修改。</p><h1 id="拉取镜像"><a href="#拉取镜像" class="headerlink" title="拉取镜像"></a>拉取镜像</h1><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs armasm"><span class="hljs-symbol">docker</span> pull codercom/<span class="hljs-meta">code</span>-server:latest<br></code></pre></td></tr></table></figure><h1 id="创建物理机所需要的映射目录"><a href="#创建物理机所需要的映射目录" class="headerlink" title="创建物理机所需要的映射目录"></a>创建物理机所需要的映射目录</h1><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs gradle">mkdir -p <span class="hljs-regexp">/www/</span>wwwroot<span class="hljs-regexp">/coder-server/</span>.config<br>mkdir -p <span class="hljs-regexp">/www/</span>wwwroot<span class="hljs-regexp">/coder-server/</span><span class="hljs-keyword">project</span><br></code></pre></td></tr></table></figure><h1 id="创建容器"><a href="#创建容器" class="headerlink" title="创建容器"></a>创建容器</h1><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs livescript">docker run -d -<span class="hljs-literal">it</span> --name code-server -p <span class="hljs-number">8080</span>:<span class="hljs-number">8080</span> <span class="hljs-string">\</span> <br> -v <span class="hljs-string">"/www/wwwroot/coder-server/.config:$HOME/.config"</span> <span class="hljs-string">\</span> <br> -v <span class="hljs-string">"/www/wwwroot/coder-server/project:/home/coder/project"</span> <span class="hljs-string">\</span> <br> -u <span class="hljs-string">"$(id -u):$(id -g)"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"DOCKER_USER=$USER"</span> <span class="hljs-string">\</span> <br> codercom/code-server:latest<br></code></pre></td></tr></table></figure><p>查看config.yaml中的密码,并访问8080端口就可以使用了!!!!</p><p>踩坑<br>访问提示401错误<br>这是由于配置文件(config.yaml)不存在,或者配置文件有误。我在第一次创建容器时,Docker日志提示创建了默认的配置文件,但是.config文件夹为空。</p><p>新建一个没有映射的容器,进入容器后执行cat ~/.config/code-server/config.yaml并复制文件内容,之后在物理机映射目录创建文件.config/cod-server/config.yaml粘贴内容。之后删除新建的容器,重启之前的容器。</p><p>也可以直接使用以下内容创建新文件(之后版本有可能配置文件有变,如果无效使用上面的方式)</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">bind-addr:</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-string">:8080</span><br><span class="hljs-attr">auth:</span> <span class="hljs-string">password</span><br><span class="hljs-attr">password:</span> <span class="hljs-string">*****</span><br><span class="hljs-attr">cert:</span> <span class="hljs-literal">false</span><br></code></pre></td></tr></table></figure><p>到这里重启容器后理论上是可以正常使用了,但我在尝试后还是有问题,可以在新建容器时填入密码参数,这样无论配置文件是否存在都可以使用。</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs routeros">docker <span class="hljs-built_in">run</span> -d -it --name code-server -p 8080:8080<br> -v <span class="hljs-string">"/www/wwwroot/coder-server/.config:<span class="hljs-variable">$HOME</span>/.config"</span><br> -v <span class="hljs-string">"/www/wwwroot/coder-server/project:/home/coder/project"</span><br> -u <span class="hljs-string">"(id -u):(id−u):(id -g)"</span><br> -e <span class="hljs-string">"DOCKER_USER=<span class="hljs-variable">$USER</span>"</span><br> -e <span class="hljs-string">"PASSWORD"</span>=*****<br> codercom/code-server:latest<br></code></pre></td></tr></table></figure><p>还可以不映射配置文件到物理机,之后修改配置可以进入容器再修改。</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs applescript">docker <span class="hljs-built_in">run</span> -d -<span class="hljs-keyword">it</span> <span class="hljs-comment">--name code-server -p 8080:8080</span><br> -v <span class="hljs-string">"/www/wwwroot/coder-server/project:/home/coder/project"</span><br> -u <span class="hljs-string">"(id -u):(id−u):(id -g)"</span><br> -e <span class="hljs-string">"DOCKER_USER=$USER"</span><br> codercom/code-server:latest<br></code></pre></td></tr></table></figure><p>部分功能无法使用,部分插件失效<br>右下角应该有如下的提示:</p><p>code-server is being accessed in an insecure context. Web views, the clipboard, and other functionality may not work as expected.</p><p>因为部分组件依赖于第三方的数据,这些数据请求时协议为https,如果部署时未使用https协议,浏览器因为安全问题无法获取数据。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Docker</tag>
<tag>code-server</tag>
</tags>
</entry>
<entry>
<title>JetBrains IntelliJ系列全家桶激活服务器</title>
<link href="/2023/12/26/JetBrainsIntelliJ%E7%B3%BB%E5%88%97%E5%85%A8%E5%AE%B6%E6%A1%B6%E6%BF%80%E6%B4%BB%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
<url>/2023/12/26/JetBrainsIntelliJ%E7%B3%BB%E5%88%97%E5%85%A8%E5%AE%B6%E6%A1%B6%E6%BF%80%E6%B4%BB%E6%9C%8D%E5%8A%A1%E5%99%A8/</url>
<content type="html"><![CDATA[<p>简要步骤<br>入口Ⅰ:欢迎界面 - 齿轮(设置) - Manage Licenses…</p><p>入口Ⅱ:菜单 - 帮助(Help) - 注册(Register)…</p><p>选择 License Server,输入Server address地址</p><p>点击【Activate】激活成功!!</p><p>同样支持其他编辑器噢,比如 IDEA~</p><p>如您有需要,可自行通过网络空间搜索引擎自行寻找</p><h1 id="Fofa"><a href="#Fofa" class="headerlink" title="Fofa"></a>Fofa</h1><figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs abnf"><span class="hljs-attribute">header</span><span class="hljs-operator">=</span><span class="hljs-string">"https://account.jetbrains.com/fls-auth"</span><br></code></pre></td></tr></table></figure><h1 id="Shodan"><a href="#Shodan" class="headerlink" title="Shodan"></a>Shodan</h1><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">Location: https:<span class="hljs-regexp">//</span>account.jetbrains.com/fls-auth<br></code></pre></td></tr></table></figure><h1 id="Censys"><a href="#Censys" class="headerlink" title="Censys"></a>Censys</h1><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">Location: https:<span class="hljs-regexp">//</span>account.jetbrains.com/fls-auth<br></code></pre></td></tr></table></figure>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>JetBrains</tag>
<tag>IntelliJ</tag>
</tags>
</entry>
<entry>
<title>yt-dlp使用教程</title>
<link href="/2023/12/16/yt-dlp%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/"/>
<url>/2023/12/16/yt-dlp%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</url>
<content type="html"><![CDATA[<p>很久没用youtube-dl这个工具了,然后在油管上看到想下载的视频,发现下载速度超慢,只有几十KB最多。</p><p>于是,搜一下,发现可能是被限速了吧。</p><p>找到了这个 yt-dlp 的代替工具。<br>项目地址:<a href="https://github.com/yt-dlp/yt-dlp">https://github.com/yt-dlp/yt-dlp</a></p><p>这个下载,就看个人网速了,因为我晚上下载有时候1M/s、几百K/s都有,白天下载有时候10几M/s、20~30M/s来回跳,几M/s都有。</p><p>发现它就是从youtube-dl fork过来的,就理解为是从youtube-dl复制过来的,做了一些修复和添加了一些东西。</p><h2 id="安装yt-dlp"><a href="#安装yt-dlp" class="headerlink" title="安装yt-dlp"></a>安装yt-dlp</h2><h3 id="1-安装Python和ffmpeg"><a href="#1-安装Python和ffmpeg" class="headerlink" title="1.安装Python和ffmpeg"></a>1.安装Python和ffmpeg</h3><p>是从youtube-dl复制过来的,所以,原来如果有使用youtube-dl的话,就简单了,原来都已经安装过了。就直接安装yt-dlp就可以了,用法都一样。</p><p>安装:</p><ul><li>Python:安装时把pip和添加系统环境变量都选上</li><li>ffmpeg:下载好exe文件,把目录添加到系统环境变量就行</li></ul><h3 id="2-安装yt-dlp"><a href="#2-安装yt-dlp" class="headerlink" title="2.安装yt-dlp"></a>2.安装yt-dlp</h3><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cmake">pip <span class="hljs-keyword">install</span> yt-dlp<br></code></pre></td></tr></table></figure><p>如果不想用pip安装的,就去项目地址下载exe版本:<br><a href="https://github.com/yt-dlp/yt-dlp#release-files">https://github.com/yt-dlp/yt-dlp#release-files</a></p><p>然后把yt-dlp.exe 也一样放到系统环境的目录下就行。比如就放到ffmpeg的bin目录下,跟ffmpeg.exe和youtube-dl.exe放一起就行。</p><h2 id="下载视频"><a href="#下载视频" class="headerlink" title="下载视频"></a>下载视频</h2><p>支持下载哪些网站,项目文档上也有:<br><a href="https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md">https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md</a></p><p>我这里就有下载油管的视频举例。</p><p>比如我想下载这个视频:<a href="https://www.youtube.com/watch?v=kNU2WCHVVBk">https://www.youtube.com/watch?v=kNU2WCHVVBk</a><br>视频格式为:<a href="https://www.youtube.com/watch?v=">https://www.youtube.com/watch?v=</a>*************</p><h3 id="1-直接下载"><a href="#1-直接下载" class="headerlink" title="1.直接下载"></a>1.直接下载</h3><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-comment"># 默认格式,高于720P的格式一般是 webm 格式</span><br>yt-dlp https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk<br><br><span class="hljs-comment"># 下载视频转换成mp4(用--merge-output-format参数)</span><br>yt-dlp --merge-output-format mp4 https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk<br></code></pre></td></tr></table></figure><h3 id="2-查看视频所有分辨率"><a href="#2-查看视频所有分辨率" class="headerlink" title="2.查看视频所有分辨率"></a>2.查看视频所有分辨率</h3><p>跟用 youtube-dl命令一样,先用 <code>-F</code>参数查看有哪些分辨率。</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">yt-dlp -F https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk<br></code></pre></td></tr></table></figure><p><img src="https://i007it.com/img/yt-dlp.png"></p><p>结果跟用 youtube-dl命令的差不多,标题行含义: > ID:文件ID > EXT:格式 > RESOLUTION:分辨率 > FPS:视频的帧率 > FILESIZE:文件大小 > VCODEC:audio only表示仅音频 > ACODEC:video only表示仅视频(没有音频);像mp4a.40.2(720p)就直接包含了音频</p><h3 id="3-下载指定分辨率"><a href="#3-下载指定分辨率" class="headerlink" title="3.下载指定分辨率"></a>3.下载指定分辨率</h3><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-comment"># 1.只下载音频</span><br><span class="hljs-comment"># 找m4a格式,列表越靠后越清晰。比如ID:140 | EXT:m4a | audio only</span><br>yt-dlp -f140 https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk<br><br><span class="hljs-comment"># 2.下载音频转换成mp3(加上-x --audio-format参数)</span><br>yt-dlp -f140 -x --audio-format mp3 https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk<br><br><span class="hljs-comment"># 3.下载视频(带音频)ID:22 | EXT:mp4 | 1280*720</span><br>yt-dlp -f22 https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk<br><br><span class="hljs-comment"># 4.下载指定分辨率视频+音频(为了方便就直接下载mp4格式了)</span><br><span class="hljs-comment"># 1080及以上分辨率的音频和视频是分开的,所以一般会音频和视频一起下载</span><br>yt-dlp -f299+<span class="hljs-number">140</span> https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk<br><br><span class="hljs-comment"># 5.(通用)下载最佳mp4视频+最佳m4a音频格式并合成mp4</span><br>yt-dlp -f <span class="hljs-string">'bv[ext=mp4]+ba[ext=m4a]'</span> --embed-metadata --merge-output-format mp4 https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk<br><br><span class="hljs-comment"># 6.指定文件名下载(用-o参数)</span><br><span class="hljs-comment"># 默认下载的文件格式是:title+空格+[id].格式,比如***** [kNU2WCHVVBk].mp4</span><br><span class="hljs-comment"># 文件名只要标题,不要id,加上 -o '%(title)s.mp4'</span><br>yt-dlp -f <span class="hljs-string">'bv[ext=mp4]+ba[ext=m4a]'</span> --embed-metadata --merge-output-format mp4 https:<span class="hljs-regexp">//</span>www.youtube.com/watch?v=kNU2WCHVVBk -o <span class="hljs-string">'%(title)s.mp4'</span><br></code></pre></td></tr></table></figure><p>最方便直接用,可以直接用最后一种通用的下载最佳视频的方式。</p><h3 id="5-下载播放列表所有视频"><a href="#5-下载播放列表所有视频" class="headerlink" title="5.下载播放列表所有视频"></a>5.下载播放列表所有视频</h3><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs asciidoc">yt-dlp https://www.youtube.com/playlist?list=<span class="hljs-strong">*****</span><span class="hljs-strong">*****</span><br></code></pre></td></tr></table></figure>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Youtube</tag>
<tag>yt-dlp</tag>
</tags>
</entry>
<entry>
<title>使用Cloudflare创建镜像站</title>
<link href="/2023/12/12/%E4%BD%BF%E7%94%A8Cloudflare%E5%88%9B%E5%BB%BA%E9%95%9C%E5%83%8F%E7%AB%99/"/>
<url>/2023/12/12/%E4%BD%BF%E7%94%A8Cloudflare%E5%88%9B%E5%BB%BA%E9%95%9C%E5%83%8F%E7%AB%99/</url>
<content type="html"><![CDATA[<p>最近使用Unsplash的API,但是速度太慢了,简直受不了,本来打算搞一台国外服务器来中转,忽然发现可以利用Cloudflare的Worker来制作镜像站,Workers 每天有免费的 10 万次请求,个人使用绰绰有余了,还可以绑定自定义域名。</p><h2 id="创建镜像站"><a href="#创建镜像站" class="headerlink" title="创建镜像站"></a>创建镜像站</h2><p>首先登录cloudflare.com,进入控制台 - Works - 创建服务 - 选择HTTP处理程序</p><p><a href="https://static.notemi.cn/writer/SCR-20230225-wid.png"></a><a href="https://static.notemi.cn/writer/SCR-20230225-wid.png"><img src="https://static.notemi.cn/writer/SCR-20230225-wid.png" alt="使用Cloudflare创建镜像站" title="点击放大图片"></a></p><p>创建完成后,点击快速编辑</p><p><a href="https://static.notemi.cn/writer/image-20230225232840513.png"></a><a href="https://static.notemi.cn/writer/image-20230225232840513.png"><img src="https://static.notemi.cn/writer/image-20230225232840513.png" alt="使用Cloudflare创建镜像站" title="点击放大图片"></a></p><p>拷贝进下方的代码:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">// 你要镜像的网站.</span><br><span class="hljs-keyword">const</span> upstream = <span class="hljs-string">'www.google.com'</span><br><span class="hljs-comment">// 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可.</span><br><span class="hljs-keyword">const</span> upstream_path = <span class="hljs-string">'/'</span><br><span class="hljs-comment">// 镜像站是否有手机访问专用网址,没有则填一样的.</span><br><span class="hljs-keyword">const</span> upstream_mobile = <span class="hljs-string">'www.google.com'</span><br><span class="hljs-comment">// 屏蔽国家和地区.</span><br><span class="hljs-keyword">const</span> blocked_region = [<span class="hljs-string">'KP'</span>, <span class="hljs-string">'SY'</span>, <span class="hljs-string">'PK'</span>, <span class="hljs-string">'CU'</span>]<br><span class="hljs-comment">// 屏蔽 IP 地址.</span><br><span class="hljs-keyword">const</span> blocked_ip_address = [<span class="hljs-string">'0.0.0.0'</span>, <span class="hljs-string">'127.0.0.1'</span>]<br><span class="hljs-comment">// 镜像站是否开启 HTTPS.</span><br><span class="hljs-keyword">const</span> https = <span class="hljs-literal">true</span><br><span class="hljs-comment">// 文本替换.</span><br><span class="hljs-keyword">const</span> replace_dict = {<br> <span class="hljs-string">'$upstream'</span>: <span class="hljs-string">'$custom_domain'</span>,<br> <span class="hljs-string">'//www.google.com'</span>: <span class="hljs-string">''</span><br>}<br><span class="hljs-comment">// 以下保持默认,不要动</span><br><span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'fetch'</span>, <span class="hljs-function"><span class="hljs-params">event</span> =></span> {<br> event.<span class="hljs-title function_">respondWith</span>(<span class="hljs-title function_">fetchAndApply</span>(event.<span class="hljs-property">request</span>));<br>})<br><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">fetchAndApply</span>(<span class="hljs-params">request</span>) {<br> <span class="hljs-keyword">const</span> region = request.<span class="hljs-property">headers</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'cf-ipcountry'</span>).<span class="hljs-title function_">toUpperCase</span>();<br> <span class="hljs-keyword">const</span> ip_address = request.<span class="hljs-property">headers</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'cf-connecting-ip'</span>);<br> <span class="hljs-keyword">const</span> user_agent = request.<span class="hljs-property">headers</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'user-agent'</span>);<br> <span class="hljs-keyword">let</span> response = <span class="hljs-literal">null</span>;<br> <span class="hljs-keyword">let</span> url = <span class="hljs-keyword">new</span> <span class="hljs-title function_">URL</span>(request.<span class="hljs-property">url</span>);<br> <span class="hljs-keyword">let</span> url_hostname = url.<span class="hljs-property">hostname</span>;<br> <span class="hljs-keyword">if</span> (https == <span class="hljs-literal">true</span>) {<br> url.<span class="hljs-property">protocol</span> = <span class="hljs-string">'https:'</span>;<br> } <span class="hljs-keyword">else</span> {<br> url.<span class="hljs-property">protocol</span> = <span class="hljs-string">'http:'</span>;<br> }<br> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">await</span> <span class="hljs-title function_">device_status</span>(user_agent)) {<br> <span class="hljs-keyword">var</span> upstream_domain = upstream;<br> } <span class="hljs-keyword">else</span> {<br> <span class="hljs-keyword">var</span> upstream_domain = upstream_mobile;<br> }<br> url.<span class="hljs-property">host</span> = upstream_domain;<br> <span class="hljs-keyword">if</span> (url.<span class="hljs-property">pathname</span> == <span class="hljs-string">'/'</span>) {<br> url.<span class="hljs-property">pathname</span> = upstream_path;<br> } <span class="hljs-keyword">else</span> {<br> url.<span class="hljs-property">pathname</span> = upstream_path + url.<span class="hljs-property">pathname</span>;<br> }<br> <span class="hljs-keyword">if</span> (blocked_region.<span class="hljs-title function_">includes</span>(region)) {<br> response = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-string">'Access denied: WorkersProxy is not available in your region yet.'</span>, {<br> <span class="hljs-attr">status</span>: <span class="hljs-number">403</span><br> });<br> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (blocked_ip_address.<span class="hljs-title function_">includes</span>(ip_address)) {<br> response = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-string">'Access denied: Your IP address is blocked by WorkersProxy.'</span>, {<br> <span class="hljs-attr">status</span>: <span class="hljs-number">403</span><br> });<br> } <span class="hljs-keyword">else</span> {<br> <span class="hljs-keyword">let</span> method = request.<span class="hljs-property">method</span>;<br> <span class="hljs-keyword">let</span> request_headers = request.<span class="hljs-property">headers</span>;<br> <span class="hljs-keyword">let</span> new_request_headers = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Headers</span>(request_headers);<br> new_request_headers.<span class="hljs-title function_">set</span>(<span class="hljs-string">'Host'</span>, url.<span class="hljs-property">hostname</span>);<br> new_request_headers.<span class="hljs-title function_">set</span>(<span class="hljs-string">'Referer'</span>, url.<span class="hljs-property">hostname</span>);<br> <span class="hljs-keyword">let</span> original_response = <span class="hljs-keyword">await</span> <span class="hljs-title function_">fetch</span>(url.<span class="hljs-property">href</span>, {<br> <span class="hljs-attr">method</span>: method,<br> <span class="hljs-attr">headers</span>: new_request_headers<br> })<br> <span class="hljs-keyword">let</span> original_response_clone = original_response.<span class="hljs-title function_">clone</span>();<br> <span class="hljs-keyword">let</span> original_text = <span class="hljs-literal">null</span>;<br> <span class="hljs-keyword">let</span> response_headers = original_response.<span class="hljs-property">headers</span>;<br> <span class="hljs-keyword">let</span> new_response_headers = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Headers</span>(response_headers);<br> <span class="hljs-keyword">let</span> status = original_response.<span class="hljs-property">status</span>;<br> new_response_headers.<span class="hljs-title function_">set</span>(<span class="hljs-string">'access-control-allow-origin'</span>, <span class="hljs-string">'*'</span>);<br> new_response_headers.<span class="hljs-title function_">set</span>(<span class="hljs-string">'access-control-allow-credentials'</span>, <span class="hljs-literal">true</span>);<br> new_response_headers.<span class="hljs-title function_">delete</span>(<span class="hljs-string">'content-security-policy'</span>);<br> new_response_headers.<span class="hljs-title function_">delete</span>(<span class="hljs-string">'content-security-policy-report-only'</span>);<br> new_response_headers.<span class="hljs-title function_">delete</span>(<span class="hljs-string">'clear-site-data'</span>);<br> <span class="hljs-keyword">const</span> content_type = new_response_headers.<span class="hljs-title function_">get</span>(<span class="hljs-string">'content-type'</span>);<br> <span class="hljs-keyword">if</span> (content_type.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'text/html'</span>) && content_type.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'UTF-8'</span>)) {<br> original_text = <span class="hljs-keyword">await</span> <span class="hljs-title function_">replace_response_text</span>(original_response_clone, upstream_domain, url_hostname);<br> } <span class="hljs-keyword">else</span> {<br> original_text = original_response_clone.<span class="hljs-property">body</span><br> }<br> response = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(original_text, {<br> status,<br> <span class="hljs-attr">headers</span>: new_response_headers<br> })<br> }<br> <span class="hljs-keyword">return</span> response;<br>}<br><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">replace_response_text</span>(<span class="hljs-params">response, upstream_domain, host_name</span>) {<br> <span class="hljs-keyword">let</span> text = <span class="hljs-keyword">await</span> response.<span class="hljs-title function_">text</span>()<br> <span class="hljs-keyword">var</span> i, j;<br> <span class="hljs-keyword">for</span> (i <span class="hljs-keyword">in</span> replace_dict) {<br> j = replace_dict[i]<br> <span class="hljs-keyword">if</span> (i == <span class="hljs-string">'$upstream'</span>) {<br> i = upstream_domain<br> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (i == <span class="hljs-string">'$custom_domain'</span>) {<br> i = host_name<br> }<br> <span class="hljs-keyword">if</span> (j == <span class="hljs-string">'$upstream'</span>) {<br> j = upstream_domain<br> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (j == <span class="hljs-string">'$custom_domain'</span>) {<br> j = host_name<br> }<br> <span class="hljs-keyword">let</span> re = <span class="hljs-keyword">new</span> <span class="hljs-title class_">RegExp</span>(i, <span class="hljs-string">'g'</span>)<br> text = text.<span class="hljs-title function_">replace</span>(re, j);<br> }<br> <span class="hljs-keyword">return</span> text;<br>}<br><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">device_status</span>(<span class="hljs-params">user_agent_info</span>) {<br> <span class="hljs-keyword">var</span> agents = [<span class="hljs-string">"Android"</span>, <span class="hljs-string">"iPhone"</span>, <span class="hljs-string">"SymbianOS"</span>, <span class="hljs-string">"Windows Phone"</span>, <span class="hljs-string">"iPad"</span>, <span class="hljs-string">"iPod"</span>];<br> <span class="hljs-keyword">var</span> flag = <span class="hljs-literal">true</span>;<br> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> v = <span class="hljs-number">0</span>; v < agents.<span class="hljs-property">length</span>; v++) {<br> <span class="hljs-keyword">if</span> (user_agent_info.<span class="hljs-title function_">indexOf</span>(agents[v]) > <span class="hljs-number">0</span>) {<br> flag = <span class="hljs-literal">false</span>;<br> <span class="hljs-keyword">break</span>;<br> }<br> }<br> <span class="hljs-keyword">return</span> flag;<br>}<br></code></pre></td></tr></table></figure><p>点击右边的预览,就可以使用系统分配的域名访问到Google了。</p><p><a href="https://static.notemi.cn/writer/image-20230225233608927.png"></a><a href="https://static.notemi.cn/writer/image-20230225233608927.png"><img src="https://static.notemi.cn/writer/image-20230225233608927.png" alt="使用Cloudflare创建镜像站" title="点击放大图片"></a></p><p>我这边想创建Unsplash简易API的镜像站:source.unsplash.com,将代码中的<a href="http://www.google.com换成source.unsplash.com就可以了,如果要创建其他网站,换成对应域名就行,如github就换成github.com/">www.google.com换成source.unsplash.com就可以了,如果要创建其他网站,换成对应域名就行,如github就换成github.com</a></p><p>替换成后,预览一下,成功了。</p><p><a href="https://static.notemi.cn/writer/image-20230225233816224.png"></a><a href="https://static.notemi.cn/writer/image-20230225233816224.png"><img src="https://static.notemi.cn/writer/image-20230225233816224.png" alt="使用Cloudflare创建镜像站" title="点击放大图片"></a></p><p>这样就可以通过worker分配的域名访问服务了,如果想自定义域名,继续往下看。</p><h2 id="绑定自定义域名"><a href="#绑定自定义域名" class="headerlink" title="绑定自定义域名"></a>绑定自定义域名</h2><p>主要分两个步骤,一个是自定义域名添加到 <code>CloudFlare</code>网络,另一个是将该域名指向 <code>Worker</code>子域名进行关联。这两个步骤先后顺序没有严格要求。</p><p>添加站点</p><p><a href="https://static.notemi.cn/writer/image-20230226222911480.png"></a><a href="https://static.notemi.cn/writer/image-20230226222911480.png"><img src="https://static.notemi.cn/writer/image-20230226222911480.png" alt="使用Cloudflare创建镜像站" title="点击放大图片"></a></p><p>添加DNS - IPv4地址随便填,主要是将域名接入CloudFlare</p><p><a href="https://static.notemi.cn/writer/image-20230226223107015.png"></a><a href="https://static.notemi.cn/writer/image-20230226223107015.png"><img src="https://static.notemi.cn/writer/image-20230226223107015.png" alt="使用Cloudflare创建镜像站" title="点击放大图片"></a></p><p>Worker绑定自定义域名</p><p><a href="https://static.notemi.cn/writer/image-20230226223329983.png"></a><a href="https://static.notemi.cn/writer/image-20230226223329983.png"><img src="https://static.notemi.cn/writer/image-20230226223329983.png" alt="使用Cloudflare创建镜像站" title="点击放大图片"></a></p><p><code>路由</code>填写上一步的子域名(如:<code>unsplash.notemi.cn/*</code>),<code>区域</code>选择上面添加的 <code>站点</code>:</p><p><a href="https://static.notemi.cn/writer/image-20230226223425432.png"></a><a href="https://static.notemi.cn/writer/image-20230226223425432.png"><img src="https://static.notemi.cn/writer/image-20230226223425432.png" alt="使用Cloudflare创建镜像站" title="点击放大图片"></a></p><p>添加好就可以使用自定义域名访问了。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://hexsen.com/cloudflare-workers-to-google.html">使用 Cloudflare Workers™ 制作镜像站,可访问谷歌-何先生 (hexsen.com)</a></p><p><a href="https://www.idcfq.com/297.html">CloudFlare Workers 设置使用自己的域名 - 80后'Blog (idcfq.com)</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Cloudflare</tag>
<tag>Unsplash</tag>
<tag>代理</tag>
</tags>
</entry>
<entry>
<title>群晖系统安全设置禁止所有外国IP访问 添加网络威胁黑名单</title>
<link href="/2023/12/12/%E7%BE%A4%E6%99%96%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE%E7%A6%81%E6%AD%A2%E6%89%80%E6%9C%89%E5%A4%96%E5%9B%BDIP%E8%AE%BF%E9%97%AE%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%BB%9C%E5%A8%81%E8%83%81%E9%BB%91%E5%90%8D%E5%8D%95/"/>
<url>/2023/12/12/%E7%BE%A4%E6%99%96%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE%E7%A6%81%E6%AD%A2%E6%89%80%E6%9C%89%E5%A4%96%E5%9B%BDIP%E8%AE%BF%E9%97%AE%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%BB%9C%E5%A8%81%E8%83%81%E9%BB%91%E5%90%8D%E5%8D%95/</url>
<content type="html"><![CDATA[<p>群晖系统本身的安全设置能隔绝多数网络威胁,通过简单的设置只要不瞎搞基本能安全无忧!</p><p>注:本文内容大部分来自 无尽光芒 的 “群晖系统安全设置”PDF文档,暂未找到具体出处网址。</p><h1 id="一、群晖的基本安全设置修改"><a href="#一、群晖的基本安全设置修改" class="headerlink" title="一、群晖的基本安全设置修改"></a>一、群晖的基本安全设置修改</h1><h2 id="1、禁用admin账户"><a href="#1、禁用admin账户" class="headerlink" title="1、禁用admin账户"></a>1、禁用admin账户</h2><p>DSM7默认就是禁用admin作为管理员账户的,如实DSM6或者升级到7的可以新建管理员后再禁用admin</p><p><img src="https://i.imnks.com/2022/10/2584009654.png!I" alt="2584009654.png" title="2584009654.png"></p><h2 id="2、使用高强度密码"><a href="#2、使用高强度密码" class="headerlink" title="2、使用高强度密码"></a>2、使用高强度密码</h2><p><img src="https://i.imnks.com/2022/10/1104970198.png!I" alt="1104970198.png" title="1104970198.png"></p><h2 id="3、修改等候超时"><a href="#3、修改等候超时" class="headerlink" title="3、修改等候超时"></a>3、修改等候超时</h2><p>默认是网页上15分钟没操作自动退出登录,按需修改,时间太短会影响使用体验</p><p><img src="https://i.imnks.com/2022/10/2587833162.png!I" alt="2587833162.png" title="2587833162.png"></p><h2 id="4、开启双重验证"><a href="#4、开启双重验证" class="headerlink" title="4、开启双重验证"></a>4、开启双重验证</h2><p>DSM7的双重验证支持OPT验证码(Synology Secure SignIn或者Google Authenticator)</p><p>也支持硬件安全秘钥(x86机型才有),比如USB秘钥类(Fido2)的YubiKey、飞天Key</p><p><img src="https://i.imnks.com/2022/10/2296208027.png!I" alt="2296208027.png" title="2296208027.png"></p><p><img src="https://i.imnks.com/2022/10/906380087.png!I" alt="906380087.png" title="906380087.png"></p><h2 id="5、关闭SHH访问"><a href="#5、关闭SHH访问" class="headerlink" title="5、关闭SHH访问"></a>5、关闭SHH访问</h2><p>如确实需要使用,修改默认的22端口为10000以上的端口,并使用后及时关闭!</p><p><img src="https://i.imnks.com/2022/10/570795422.png!I" alt="570795422.png" title="570795422.png"></p><h2 id="6、对外端口映射"><a href="#6、对外端口映射" class="headerlink" title="6、对外端口映射"></a>6、对外端口映射</h2><p>如有公网IP在路由器端口映射时对外不要使用默认的5000、5001、5005、5006、6690等!对外依旧建议10000以上的端口</p><p><img src="https://i.imnks.com/2022/10/2129729179.png!I" alt="2129729179.png" title="2129729179.png"></p><h2 id="7、关闭root账户"><a href="#7、关闭root账户" class="headerlink" title="7、关闭root账户"></a>7、关闭root账户</h2><p>非常不建议开启群晖的root账户,如必需用请修改为高强度的root密码,也可使用完毕后关闭!</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">synouser <span class="hljs-attr">--setpw</span> root qpzm<span class="hljs-keyword">@1639</span>&IMNKS.COM<br></code></pre></td></tr></table></figure><p>或者直接关闭root登录</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">sed -i <span class="hljs-string">'s/PermitRootLogin yes/#PermitRootLogin prohibit-password/g'</span> <span class="hljs-regexp">/etc/</span>ssh/sshd_config<br></code></pre></td></tr></table></figure><h1 id="二、配置防火墙禁止国外IP"><a href="#二、配置防火墙禁止国外IP" class="headerlink" title="二、配置防火墙禁止国外IP"></a>二、配置防火墙禁止国外IP</h1><h2 id="1、启用防火墙"><a href="#1、启用防火墙" class="headerlink" title="1、启用防火墙"></a>1、启用防火墙</h2><p><img src="https://i.imnks.com/2022/10/208038144.png!I" alt="208038144.png" title="208038144.png"></p><h2 id="2、编译配置文件default"><a href="#2、编译配置文件default" class="headerlink" title="2、编译配置文件default"></a>2、编译配置文件default</h2><p>新增防火墙规则,下面三个按需设置,设置禁止国外IP访问前 必需 先设置好 允许内网IP访问、允许中国IP!!!</p><h3 id="允许内网IP访问"><a href="#允许内网IP访问" class="headerlink" title="允许内网IP访问"></a>允许内网IP访问</h3><p>内网这个按照实际情况添加,如过多个IP段内网可以互访都要相应的加入,包括虚拟组网的IP段!</p><p><img src="https://i.imnks.com/2022/10/47474197.png!I" alt="47474197.png" title="47474197.png"></p><p>如何docker使用了bridge桥接网络,也需要添加到允许访问的名单内</p><p><img src="https://i.imnks.com/2022/10/1852161711.png!I" alt="1852161711.png" title="1852161711.png"></p><h3 id="允许中国IP访问-如果要外网只能访问特定端口,不要添加这个!"><a href="#允许中国IP访问-如果要外网只能访问特定端口,不要添加这个!" class="headerlink" title="允许中国IP访问(如果要外网只能访问特定端口,不要添加这个!)"></a>允许中国IP访问(如果要外网只能访问特定端口,不要添加这个!)</h3><p><img src="https://i.imnks.com/2022/10/799088048.png!I" alt="799088048.png" title="799088048.png"></p><h3 id="禁止国外IP访问(注意:排序永远是最后一个!)"><a href="#禁止国外IP访问(注意:排序永远是最后一个!)" class="headerlink" title="禁止国外IP访问(注意:排序永远是最后一个!)"></a>禁止国外IP访问(注意:排序永远是最后一个!)</h3><p><img src="https://i.imnks.com/2022/10/3105674518.png!I" alt="3105674518.png" title="3105674518.png"></p><p><img src="https://i.imnks.com/2022/10/3483480270.png!I" alt="3483480270.png" title="3483480270.png"></p><h1 id="三、添加网络威胁黑名单"><a href="#三、添加网络威胁黑名单" class="headerlink" title="三、添加网络威胁黑名单"></a>三、添加网络威胁黑名单</h1><p>东北大学网络威胁黑名单系统(已恢复访问) <a href="https://imnks.com/go/aHR0cDovL2FudGl2aXJ1cy5uZXUuZWR1LmNuL3NjYW4v">http://antivirus.neu.edu.cn/scan/</a></p><p>下载文本格式的黑名单导入群晖系统的封锁名单:<a href="https://imnks.com/go/aHR0cDovL2FudGl2aXJ1cy5uZXUuZWR1LmNuL3NzaC9saXN0cy9uZXUudHh0">http://antivirus.neu.edu.cn/ssh/lists/neu.txt</a></p><p><img src="https://i.imnks.com/2022/10/3367593950.png!I" alt="3367593950.png" title="3367593950.png"></p><p><img src="https://i.imnks.com/2022/10/3554383717.png!I" alt="3554383717.png" title="3554383717.png"></p><p><img src="https://i.imnks.com/2022/10/3523239348.png!I" alt="3523239348.png" title="3523239348.png"></p><h1 id="四、安全顾问扫描"><a href="#四、安全顾问扫描" class="headerlink" title="四、安全顾问扫描"></a>四、安全顾问扫描</h1><p><img src="https://i.imnks.com/2022/10/4132601483.png!I" alt="4132601483.png" title="4132601483.png"></p><p><img src="https://i.imnks.com/2022/10/182347195.png!I" alt="182347195.png" title="182347195.png"></p><p>本文来自<a href="https://imnks.com/6807.html">https://imnks.com/6807.html</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>群晖</tag>
<tag>安全</tag>
<tag>软路由</tag>
</tags>
</entry>
<entry>
<title>CloudflareR2快速开始使用(白嫖)指南</title>
<link href="/2022/07/28/CloudflareR2%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%E6%95%99%E7%A8%8B/"/>
<url>/2022/07/28/CloudflareR2%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%E6%95%99%E7%A8%8B/</url>
<content type="html"><![CDATA[<h1 id="R2入门指南"><a href="#R2入门指南" class="headerlink" title="R2入门指南"></a>R2入门指南</h1><p>Cloudflare R2存储允许开发人员存储大量非结构化数据,而无需支付与典型云存储服务相关的昂贵出口带宽费用。</p><h2 id="购买R2"><a href="#购买R2" class="headerlink" title="购买R2"></a>购买R2</h2><p>在创建第一个存储桶之前,您必须在Cloudflare仪表板中购买R2。(使用易贝卡就可以)</p><p><img src="https://s2.loli.net/2022/07/28/gKb5GlkZDCcR1jQ.png"></p><p>购买R2:</p><ol><li>登录<a href="https://dash.cloudflare.com/">Cloudflare仪表板</a>。</li><li>在<strong>帐户主页中</strong>,选择<strong>R2</strong>。</li><li>选择<strong>购买R2计划</strong>。</li><li>选择<strong>继续查看付款详情</strong>以查看您的付款。</li><li>选择<strong>返回 R2</strong>以前往 R2 面板。</li></ol><p><img src="https://s2.loli.net/2022/07/28/28tQ4uCyqfhAnkD.png"></p><h2 id="R2-的配额限制"><a href="#R2-的配额限制" class="headerlink" title="R2 的配额限制"></a>R2 的配额限制</h2><p>在公测期间,R2 有如下的配额限制:</p><ul><li>每个账户可新建1000个存储桶</li><li>每个存储桶可存储无限个对象</li><li>每个对象大小最大5TB</li><li>单次最大上传大小5GB,可多次分段上传</li><li>每秒1000次的 A 类操作</li><li>每秒250次的 B 类操作</li></ul><p>A 类操作包括ListBuckets、PutBucket、ListObjects、PutObject、CopyObject、CompleteMultipartUpload、CreateMultipartUpload、UploadPart、UploadPartCopy</p><p>B 类操作包括HeadBucket、HeadObject和GetObject</p><p>免费操作包括DeleteObject、DeleteBucket、DeleteMultipartUpload</p><h2 id="R2-的收费价格"><a href="#R2-的收费价格" class="headerlink" title="R2 的收费价格"></a>R2 的收费价格</h2><p>R2 存储的价格要比目前的存储服务都低,有一部分免费额度,免费额度用完以后才开始计费:</p><ul><li>存储费用:每个月10GB免费额度,超出后每个月每 GB 收取 $0.015 的存储费用</li><li>A 类操作费用:每个月一百万次免费额度,超出后每百万次收取 $4.50 的操作费用</li><li>B 类操作费用:每个月一千万次免费额度,超出后每百万次收取 $0.36 的操作费用</li></ul><p>由上可见价格比现有的存储服务厂商低的多,AWS 的 S3 是不是瑟瑟发抖?</p><h2 id="创建存储桶"><a href="#创建存储桶" class="headerlink" title="创建存储桶"></a>创建存储桶</h2><p>点击创建-输入名称-提交就好了</p><p><img src="https://s2.loli.net/2022/07/28/5ln1ZIStivQWcMb.png" alt="image-20220728234636813"></p><h2 id="造个Workers访问你的桶"><a href="#造个Workers访问你的桶" class="headerlink" title="造个Workers访问你的桶"></a>造个Workers访问你的桶</h2><p>打开workers,创建一个workers服务</p><p>并填入下面的代码</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">"fetch"</span>, <span class="hljs-function"><span class="hljs-params">event</span> =></span> {<br> event.<span class="hljs-title function_">respondWith</span>(<span class="hljs-title function_">handleRequest</span>(event.<span class="hljs-property">request</span>))<br>})<br><br><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">handleRequest</span>(<span class="hljs-params">request</span>) {<br> <span class="hljs-keyword">const</span> url = <span class="hljs-keyword">new</span> <span class="hljs-title function_">URL</span>(request.<span class="hljs-property">url</span>)<br> <span class="hljs-keyword">const</span> objectName = url.<span class="hljs-property">pathname</span>.<span class="hljs-title function_">slice</span>(<span class="hljs-number">1</span>)<br><br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`<span class="hljs-subst">${request.method}</span> object <span class="hljs-subst">${objectName}</span>: <span class="hljs-subst">${request.url}</span>`</span>)<br><br> <span class="hljs-keyword">if</span> (request.<span class="hljs-property">method</span> === <span class="hljs-string">'GET'</span> || request.<span class="hljs-property">method</span> === <span class="hljs-string">'HEAD'</span>) {<br> <span class="hljs-keyword">if</span> (objectName === <span class="hljs-string">''</span>) {<br> <span class="hljs-keyword">if</span> (request.<span class="hljs-property">method</span> == <span class="hljs-string">'HEAD'</span>) {<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-literal">undefined</span>, { <span class="hljs-attr">status</span>: <span class="hljs-number">400</span> })<br> }<br><br> <span class="hljs-keyword">const</span> options = {<br> <span class="hljs-attr">prefix</span>: url.<span class="hljs-property">searchParams</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'prefix'</span>) ?? <span class="hljs-literal">undefined</span>,<br> <span class="hljs-attr">delimiter</span>: url.<span class="hljs-property">searchParams</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'delimiter'</span>) ?? <span class="hljs-literal">undefined</span>,<br> <span class="hljs-attr">cursor</span>: url.<span class="hljs-property">searchParams</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'cursor'</span>) ?? <span class="hljs-literal">undefined</span>,<br> <span class="hljs-attr">include</span>: [<span class="hljs-string">'customMetadata'</span>, <span class="hljs-string">'httpMetadata'</span>],<br> }<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(options))<br><br> <span class="hljs-keyword">const</span> listing = <span class="hljs-keyword">await</span> <span class="hljs-variable constant_">R2</span>.<span class="hljs-title function_">list</span>(options)<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(listing), {<br> <span class="hljs-attr">headers</span>: {<br> <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'application/json; charset=UTF-8'</span>,<br> }<br> })<br> }<br><br> <span class="hljs-keyword">if</span> (request.<span class="hljs-property">method</span> === <span class="hljs-string">'GET'</span>) {<br> <span class="hljs-keyword">const</span> range = <span class="hljs-title function_">parseRange</span>(request.<span class="hljs-property">headers</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'range'</span>))<br> <span class="hljs-keyword">const</span> object = <span class="hljs-keyword">await</span> <span class="hljs-variable constant_">R2</span>.<span class="hljs-title function_">get</span>(objectName, {<br> range,<br> <span class="hljs-attr">onlyIf</span>: request.<span class="hljs-property">headers</span>,<br> })<br><br> <span class="hljs-keyword">if</span> (object === <span class="hljs-literal">null</span>) {<br> <span class="hljs-keyword">return</span> <span class="hljs-title function_">objectNotFound</span>(objectName)<br> }<br><br> <span class="hljs-keyword">const</span> headers = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Headers</span>()<br> <span class="hljs-comment">//object.writeHttpMetadata(headers)</span><br> headers.<span class="hljs-title function_">set</span>(<span class="hljs-string">'etag'</span>, object.<span class="hljs-property">httpEtag</span>)<br> <span class="hljs-keyword">const</span> status = object.<span class="hljs-property">body</span> ? (range ? <span class="hljs-number">206</span> : <span class="hljs-number">200</span>) : <span class="hljs-number">304</span><br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(object.<span class="hljs-property">body</span>, {<br> headers,<br> status<br> })<br> }<br><br> <span class="hljs-keyword">const</span> object = <span class="hljs-keyword">await</span> <span class="hljs-variable constant_">R2</span>.<span class="hljs-title function_">head</span>(objectName, {<br> <span class="hljs-attr">onlyIf</span>: request.<span class="hljs-property">headers</span>,<br> })<br><br> <span class="hljs-keyword">if</span> (object === <span class="hljs-literal">null</span>) {<br> <span class="hljs-keyword">return</span> <span class="hljs-title function_">objectNotFound</span>(objectName)<br> }<br><br> <span class="hljs-keyword">const</span> headers = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Headers</span>()<br> <span class="hljs-comment">//object.writeHttpMetadata(headers)</span><br> headers.<span class="hljs-title function_">set</span>(<span class="hljs-string">'etag'</span>, object.<span class="hljs-property">httpEtag</span>)<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-literal">null</span>, {<br> headers,<br> })<br> }<br> <span class="hljs-keyword">if</span> (request.<span class="hljs-property">method</span> === <span class="hljs-string">'PUT'</span> || request.<span class="hljs-property">method</span> == <span class="hljs-string">'POST'</span>) {<br> <span class="hljs-keyword">const</span> object = <span class="hljs-keyword">await</span> <span class="hljs-variable constant_">R2</span>.<span class="hljs-title function_">put</span>(objectName, request.<span class="hljs-property">body</span>, {<br> <span class="hljs-attr">httpMetadata</span>: request.<span class="hljs-property">headers</span>,<br> })<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-literal">null</span>, {<br> <span class="hljs-attr">headers</span>: {<br> <span class="hljs-string">'etag'</span>: object.<span class="hljs-property">httpEtag</span>,<br> }<br> })<br> }<br> <span class="hljs-keyword">if</span> (request.<span class="hljs-property">method</span> === <span class="hljs-string">'DELETE'</span>) {<br> <span class="hljs-keyword">await</span> <span class="hljs-variable constant_">R2</span>.<span class="hljs-title function_">delete</span>(url.<span class="hljs-property">pathname</span>.<span class="hljs-title function_">slice</span>(<span class="hljs-number">1</span>))<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>()<br> }<br><br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-string">`Unsupported method`</span>, {<br> <span class="hljs-attr">status</span>: <span class="hljs-number">400</span><br> })<br>}<br><br><span class="hljs-keyword">function</span> <span class="hljs-title function_">parseRange</span>(<span class="hljs-params">encoded</span>) {<br> <span class="hljs-keyword">if</span> (encoded === <span class="hljs-literal">null</span>) {<br> <span class="hljs-keyword">return</span><br> }<br><br> <span class="hljs-keyword">const</span> parts = encoded.<span class="hljs-title function_">split</span>(<span class="hljs-string">"bytes="</span>)[<span class="hljs-number">1</span>]?.<span class="hljs-title function_">split</span>(<span class="hljs-string">"-"</span>) ?? []<br> <span class="hljs-keyword">if</span> (parts.<span class="hljs-property">length</span> !== <span class="hljs-number">2</span>) {<br> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">'Not supported to skip specifying the beginning/ending byte at this time'</span>)<br> }<br><br> <span class="hljs-keyword">return</span> {<br> <span class="hljs-attr">offset</span>: <span class="hljs-title class_">Number</span>(parts[<span class="hljs-number">0</span>]),<br> <span class="hljs-attr">length</span>: <span class="hljs-title class_">Number</span>(parts[<span class="hljs-number">1</span>]) + <span class="hljs-number">1</span> - <span class="hljs-title class_">Number</span>(parts[<span class="hljs-number">0</span>]),<br> }<br>}<br><br><span class="hljs-keyword">function</span> <span class="hljs-title function_">objectNotFound</span>(<span class="hljs-params">objectName</span>) {<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-string">`<html><body>R2 object "<b><span class="hljs-subst">${objectName}</span></b>" not found</body></html>`</span>, {<br> <span class="hljs-attr">status</span>: <span class="hljs-number">404</span>,<br> <span class="hljs-attr">headers</span>: {<br> <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html; charset=UTF-8'</span><br> }<br> })<br>}<br></code></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2022/07/28/VBOkt2biy34nMJg.png" alt="image-20220728234754964"></p><p>在worker首页的设置-变量-R2 存储桶绑定,编辑变量,新建一个,左侧变量名称填入R2,右侧选择你的R2存储桶,保存</p><p><img src="https://s2.loli.net/2022/07/28/nVqPZDXsezJYkAR.png" alt="image-20220728234959075"></p><p>2.默认情况下未指定路径,方式为get时会列出所有key,根据路径能下载文件<br>3.详细解析我将稍后贴出,之后会写在自己博客上,如果你看得懂那也可以自己看<br>4.这个脚本是能够进行A类操作,也就是可以修改/删除R2,如果只读的话请自行删除</p><h2 id="如何加速?"><a href="#如何加速?" class="headerlink" title="如何加速?"></a>如何加速?</h2><p>使用第三方CFCDN平台接入你的域名</p><p>例如<a href="https://cdn.wzfou.com/">面板 | CloudFlare CDN合作接入管理平台-挖站否 – (wzfou.com)</a></p><p>在worker首页的触发器-自定义域-添加你的域名</p><p><img src="https://s2.loli.net/2022/07/28/bmv2JMFSQUaWZVr.png" alt="image-20220728235535930"></p><p>就好了</p><h2 id="如何访问?"><a href="#如何访问?" class="headerlink" title="如何访问?"></a>如何访问?</h2><p>例如你上传了一个名为abc.jpg的文件</p><p>访问地址就为<a href="https://abc.com/abc.jpg">https://abc.com/abc.jpg</a></p><h2 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h2><p>workers.dev在我们伟大的祖国里被黑名单了,直连打不开属正常,建议使用特殊方法(绑定自己的域名加速,看上面的方法)</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Cloudflare</tag>
<tag>对象存储</tag>
</tags>
</entry>
<entry>
<title>4g随身Wi-Fi刷机教程</title>
<link href="/2022/07/07/4g%E9%9A%8F%E8%BA%ABWi-Fi%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/"/>
<url>/2022/07/07/4g%E9%9A%8F%E8%BA%ABWi-Fi%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/</url>
<content type="html"><![CDATA[<h2 id="4g-随身-Wi-Fi-刷机教程"><a href="#4g-随身-Wi-Fi-刷机教程" class="headerlink" title="4g 随身 Wi-Fi 刷机教程"></a>4g 随身 Wi-Fi 刷机教程</h2><p>这是一个二十多块就能买到的, 4G USB 随身 Wi-Fi,你可能不会想到它居然跑的是安卓系统。并且还能刷 debian 系统,甚至你还能刷 openwrt 成为软路由,更棒的是 4G 和 Wi-Fi 、USB 等功能都正常工作。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/24955_origin_IMG_20220707_153431.jpg"></p><p><strong>默认基本的配置都是:</strong> 高通410 四核 1.2GHz CPU、512M 内存、4G emmc 闪存、默认 android 4.4 系统。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/1657182806244.jpg"></p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ol><li><strong>高通410(msm8916)方案的随身 Wi-Fi</strong>:板子上的丝印是 UFI001B、UFI001C、UFI003、UFI-W-001 最好,或者 SP970(不推荐,细分版本目前13个太多,基本要短接才能进 9008 模式,然后现在的 openwrt Wi-Fi 也有问题)、UZ801 也 OK;<strong>需要带卡槽、能切卡</strong>。我的版本是<strong>先机w001</strong> (根据你的情况选择是否抠esim手机卡,可以使用热风枪或者美工刀,要小心)</li></ol><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071627483.jpeg" alt="img"></p><ol><li><strong>一台 Windows 电脑</strong>(建议关闭所有杀毒软件)</li><li><strong>小卡转大卡 SIM 卡套</strong></li><li><strong>螺丝刀</strong>(拧随身 Wi-Fi 十字小螺丝)</li><li><strong>下载刷机需要的工具文件</strong></li></ol><p>工具包:</p><p><a href="https://www.aliyundrive.com/s/XZ38e2Yfjdq">https://www.aliyundrive.com/s/XZ38e2Yfjdq</a></p><p>搞基工具箱:(用来进入fastboot):</p><p><a href="https://huangenet.lanzoub.com/izUcj07i4k6b">https://huangenet.lanzoub.com/izUcj07i4k6b</a></p><p>openwrt:</p><p><a href="https://www.aliyundrive.com/s/bzGSJKYSrY7">https://www.aliyundrive.com/s/bzGSJKYSrY7</a></p><p>另一个人编译的</p><p><a href="https://github.com/OpenStick/OpenStick">https://github.com/OpenStick/OpenStick</a></p><p><a href="https://www.coolapk.com/feed/36677219?shareKey=ZWY3NjQ4MzQ2NDM2NjJjNmYyMjQ~&shareUid=524513&shareFrom=com.coolapk.market_12.2">https://www.coolapk.com/feed/36677219?shareKey=ZWY3NjQ4MzQ2NDM2NjJjNmYyMjQ~&shareUid=524513&shareFrom=com.coolapk.market_12.2</a></p><p>debian系统</p><p><a href="https://www.aliyundrive.com/s/VenG1jiBuNF">https://www.aliyundrive.com/s/VenG1jiBuNF</a></p><h2 id="检查和备份"><a href="#检查和备份" class="headerlink" title="检查和备份"></a>检查和备份</h2><h3 id="检查"><a href="#检查" class="headerlink" title="检查"></a>检查</h3><p>到手后第一件事,先插上电,连上随身 Wi-Fi 提供的 Wi-Fi,进入后台,检查下是否能正常工作,防止到手就是坏的;然后用螺丝刀拆开检查板子,是否有卡槽,以及上面的版本丝印。(可以看到我的这款有卡槽,没有丝印,但是写了一个12jj,在酷安找了半天,才知道是w001 )</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/23919_origin_1736dc4f641e2636.jpg"></p><h3 id="全量备份"><a href="#全量备份" class="headerlink" title="全量备份"></a>全量备份</h3><p>做好全量备份就不会变砖,随时刷成到手的状态</p><p>首先安装下载好的 <strong>9008</strong> 驱动</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071545851.png"></p><p>按住拇指位置的按钮插上电脑(一般不会有亮灯),在电脑设备管理器-端口设备里能看到 9008 的 COM 设备就说明连接上了。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071546430.png"></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071548184.png"></p><p>然后安装下载好的 miko,并将 Loader 移动到安装的路径下面(默认在 C:\Program Files (x86)\miko_service_tool_pro\miko_service_tool_pro),打开 Loader。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071550581.png"></p><p>然后在 miko 里依次选择 Read - Partition Backup/Earese - 点击左下角 Load Partition Structure 看到右边有系统信息的输出就说明连上了。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071551712.png"></p><p>然后点击 Read Full Image 选个路径,取个名字就开始全量备份救砖能用的 .bin 文件。过程会比较慢,可能要十几分钟。等到跑完进度条 100% 右边的输出显示 success 就备份好了,我们就能开始随意折腾。</p><p><strong>如何恢复原厂固件?</strong></p><p>打开miko(Loader.exe,网盘文件有说明),刷入文件名为xx.bin的全量包等待开机即可。按照顺序操作</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071553757.png"></p><p>如果你只需要切卡功能,可以使用酷安大佬的一键工具</p><p>最新版本看作者</p><p><a href="https://www.coolapk.com/feed/37357377?shareKey=MmI1ZTFmZTU5ODQ0NjJjNmYyMWI~&shareUid=524513&shareFrom=com.coolapk.market_12.2">https://www.coolapk.com/feed/37357377?shareKey=MmI1ZTFmZTU5ODQ0NjJjNmYyMWI~&shareUid=524513&shareFrom=com.coolapk.market_12.2</a></p><p><a href="https://www.123pan.com/s/FrsrVv-Mf97A">https://www.123pan.com/s/FrsrVv-Mf97A</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071555274.png"></p><p>把随身wifi插入,根据步骤刷机即可</p><h2 id="切换网络(电信基本可跳过此步)"><a href="#切换网络(电信基本可跳过此步)" class="headerlink" title="切换网络(电信基本可跳过此步)"></a>切换网络(电信基本可跳过此步)</h2><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071611878.jpeg" alt="img"></p><p>你可以在默认的安卓系统下直接从默认的 esim 切到你自己的卡来验证是否有网,一般联通电信都是可以正常工作的,因为刷写 openwrt 会直接使用安卓系统里的基带分区,<strong>如果使用自己的卡网络正常,可以直接跳到下一步刷 openwrt,也就是说只有切卡不能正常使用你才需要刷基带,另外刷 openwrt 目前有个 BUG :你只能使用在刷前安卓上正常工作的运营商的卡。</strong></p><p>比如看图中我插入使用的是联通卡正常工作,我刷 openwrt 就只能使用联通的卡</p><p><strong>如果你要使用移动的卡,或者你联通卡不能正常工作,那你可能需要刷下基带(看后面)。</strong></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/1657204950159.jpg"></p><h2 id="刷Openwrt"><a href="#刷Openwrt" class="headerlink" title="刷Openwrt"></a>刷Openwrt</h2><p>刷入 openwrt 十分简单,因为「苏苏小亮亮」已经做好了一键刷入的包。刷入前请确认你安卓里你插入使用的 SIM 卡正常工作。</p><h3 id="进入-fastboot-模式"><a href="#进入-fastboot-模式" class="headerlink" title="进入 fastboot 模式"></a>进入 fastboot 模式</h3><p>备份完后重新插拔,然后打开搞机工具箱,选择线刷,重启到 Fastboot,一般重启 fastboot 后随身 Wi-Fi 会亮红灯。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071614901.jpeg" alt="img"></p><p>打开解压好对应版本的 openwrt 文件夹(例如我这里刷UFI001c)</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071615023.png" alt="image-20220707161535000"></p><p>然后双击 flash.bat 就能开始刷机</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071616906.jpeg" alt="img"></p><p>能搜索到 HandsomeMod Wi-Fi 就是 openwrt 刷好了。默认的后台地址是 192.168.1.1 用户名是 root 没有密码。(如果有就是root)</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071617773.jpeg" alt="img"></p><p>在后台网络接口里,检查 MODEM 是否能正常获取 IP 地址,如果能那说明 SIM 卡能正常联网使用,你现在的 Wi-Fi 应该也是有网络的。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071618479.png" alt="image-20220707161805455"></p><h2 id="刷Debian"><a href="#刷Debian" class="headerlink" title="刷Debian"></a>刷Debian</h2><p>包大多来自这里</p><p><a href="https://www.kancloud.cn/handsomehacker/openstick/2636505">https://www.kancloud.cn/handsomehacker/openstick/2636505</a></p><p>进入 fastboot 模式</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071626725.png" alt="image-20220707162628695"></p><p>选择你的包</p><p>然后双击 flash.bat 就能开始刷机</p><p>debian账号root 密码1 可以使用ssh工具连接</p><h2 id="刷写基带"><a href="#刷写基带" class="headerlink" title="刷写基带"></a>刷写基带</h2><p>大部分的随身 Wi-Fi 都是支持电信卡的,很多其实也支持联通,移动大概率默认是不支持的。当然因为产品众多,甚至丝印型号相同用的 modem 型号都有差别,当然最麻烦的其实也是这一步,不能保证你刷了基带后移动联通就能正常使用,还是更推荐电信或联通用户使用。</p><p>首先务必备份QCN基带文件(需要root权限)。<br>打开投屏软件ARDC,连接到随身wifi,找不到设备在投屏软件菜单栏设备里选择。CMD栏里输入 adb shell su 回车,等待随身wifi shell 获取root权限(可以用上面的一键包)。或者手动进magisk赋予root权限。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071620062.jpeg" alt="img"></p><p>打开星海SVIP,按照流程操作,高通强开端口点一键执行,设备管理器会多出一个901D端口。备份QCN基带文件的路径大概等个三五分钟即可,QCN文件大小在500多kb才是有效的,不行就多重复几次操作。每一个步骤要等随身WIFI有所反应才能执行下一步。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071637011.jpeg" alt="img"></p><p>使用搞基工具箱进入fastboot模式,也可以打开投屏软件,CMD栏输入 adb reboot bootloader 回车进入fastboot。进入fastboot后红灯常亮。</p><p>首先擦除基带,打开星海SVIP,按流程操作,完成后设备会重启</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071622644.jpeg" alt="img"></p><p>设备重启后,执行高通强开1(进入901D模式,会响一下,这里一定要在设备管理器看是否是901D)</p><p>选择写入QCN,选择备份的QCN基带执行即可。不行就多重复几遍。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202207071623970.jpeg" alt="img"></p><p>好了,到这里就结束了</p><p>如果你还有问题,可以到酷安「随身 Wi-Fi」 社区,里面有很多资料可以参看</p><p>本文参考:</p><p><a href="https://qust.me/post/msm8916/">4g 随身 Wi-Fi 刷 openwrt 变成软路由 | 酱紫表 (qust.me)</a></p><p><a href="https://www.coolapk.com/feed/37147505?shareKey=ZjQ3YzhkNzg5OWE5NjJjNjhlMjk~&shareUid=524513&shareFrom=com.coolapk.market_12.2">【小白入门】随身wifi先机W001和先机003mb备份与刷机恢复基带流程 来自 UTF16 - 酷安 (coolapk.com)</a></p><p><a href="https://www.wudilad.com/?p=1502">《万物皆可刷1》小巧的4G随身WiFi刷OPENWRT畅游网络-人至践则无敌 (wudilad.com)</a></p><p><a href="https://www.coolapk.com/u/2013314">用户分享 - 酷安 (coolapk.com)</a></p><p><a href="https://www.coolapk.com/feed/37207111?shareKey=NWZhNzU1MjgzNDVmNjJjNjk5M2M~&shareUid=524513&shareFrom=com.coolapk.market_12.2">来自 噗吐血 - 酷安 (coolapk.com)</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>ADB</tag>
<tag>安卓</tag>
<tag>刷机</tag>
<tag>WIFI</tag>
</tags>
</entry>
<entry>
<title>基于RTL2832U+R820T2的RTL-SDR方案</title>
<link href="/2022/03/20/%E5%9F%BA%E4%BA%8ERTL2832U-R820T2%E7%9A%84RTL-SDR%E6%96%B9%E6%A1%88/"/>
<url>/2022/03/20/%E5%9F%BA%E4%BA%8ERTL2832U-R820T2%E7%9A%84RTL-SDR%E6%96%B9%E6%A1%88/</url>
<content type="html"><![CDATA[<p>软件定义无线电(Software-defined radio;SDR)是一项新技术,它可以代替笨重的模拟无线电,提供更大的灵活性,性能和更小的尺寸。从手机到无线耳机,再到有线调制解调器,SDR如今无处不在。然而大多数SDR设备都非常昂贵,特别是HackRF,BladeRF等等。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203202236047.gif" alt="rtl2832u-r820t2-tuner-ic-large-image.gif"></p><p>RTL-SDR是一款超廉价的软件定义无线电,基于带有RTL2832U芯片的DVB-T电视调谐器。RTL-SDR可用作宽带无线电扫描仪。可能会让业余无线电爱好者或硬件黑客感兴趣。</p><h2 id="硬件环境"><a href="#硬件环境" class="headerlink" title="硬件环境"></a>硬件环境</h2><h3 id="RTL2838U"><a href="#RTL2838U" class="headerlink" title="RTL2838U"></a>RTL2838U</h3><p>由Realtek公司制造<br><a href="http://culmart.com/play/go/aHR0cHM6Ly93d3cucmVhbHRlay5jb20vZW4vcHJvZHVjdHMvY29tbXVuaWNhdGlvbnMtbmV0d29yay1pY3MvaXRlbS9ydGwyODMydQ==">https://www.realtek.com/en/products/communications-network-ics/item/rtl2832u</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203202236628.jpeg" alt="RTL2832U+R820T2.jpg"></p><p>市场最常见这种RTL2832U解调器+R820T2调谐器方案。</p><h3 id="RTL-SDR原理图"><a href="#RTL-SDR原理图" class="headerlink" title="RTL-SDR原理图"></a>RTL-SDR原理图</h3><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203202237497.png" alt="533933-20181206162952661-988862207.png"><br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203202238533.gif" alt="rtl2832u-r820t2-tuner.gif"></p><h3 id="RTL2832U解调器"><a href="#RTL2832U解调器" class="headerlink" title="RTL2832U解调器"></a>RTL2832U解调器</h3><p>RTL2832U是一款高性能DVB-T COFDM解调器,支持USB 2.0接口。 RTL2832U符合NorDig Unified 1.0.3,D-Book 5.0和EN300 744(ETSI规范)。它支持2K或8K模式,带宽为6,7和8MHz。自动检测调制参数,例如码率和保护间隔。</p><p>RTL2832U支持IF(中频,36.125MHz),低中频(4.57MHz)或使用28.8MHz晶振的零中频输出的调谐器,并包括FM / DAB / DAB +无线电支持。 RTL2832U内置高级ADC(模数转换器),在便携式接收中具有高稳定性。</p><p>最先进的RTL2832U采用Realtek专有算法,包括卓越的信道估计,同频道接口抑制,长回声信道接收和脉冲噪声消除,为各种各样的算法提供理想的解决方案。 PC-TV的应用,如USB加密狗和MiniCard / USB,以及通过USB接口的嵌入式系统。</p><h3 id="R820T2调谐器"><a href="#R820T2调谐器" class="headerlink" title="R820T2调谐器"></a>R820T2调谐器</h3><p>R820T数字硅调谐器源自Rafael Micro最先进的架构,可实现最低功耗和最小字体系数。 R820T为所有数字广播电视标准提供无与伦比的RF性能,包括DVB-T,ATSC,DMB-T,ISDB-T。</p><p>凭借创新的AccuTuneTM和TrueRFTM机制,R820T在灵敏度,线性度,相邻信道抗扰度和镜像抑制方面具有卓越的性能。该芯片嵌入了智能功率检测器,以优化不同的输入功率情况以及无杂散动态范围。</p><p>R820T是一款高度集成的硅调谐器,内置低噪声放大器(LNA),混频器,分数PLL,VGA,稳压器和跟踪滤波器,无需外部SAW滤波器,LNA,平衡 - 不平衡转换器和LDO。得益于LNA架构,R820T为数字电视应用提供了最低成本和高性能的解决方案。片上LDO,高性能LNA和小型封装使R820T成为成本和字体因子敏感应用的完美解决方案。</p><p>凭借专有的GreenRF技术,R820T实现了高性能和最低功耗,完全符合全球趋势。 R820T采用小巧轻薄的QFN RoHs封装。</p><h2 id="软件环境"><a href="#软件环境" class="headerlink" title="软件环境"></a>软件环境</h2><h3 id="zadig"><a href="#zadig" class="headerlink" title="zadig"></a>zadig</h3><p>给SDR接收机安装usb驱动的工具。<br><a href="http://culmart.com/play/go/aHR0cHM6Ly96YWRpZy5ha2VvLmllLw==">https://zadig.akeo.ie/</a></p><h3 id="SDR"><a href="#SDR" class="headerlink" title="SDR"></a>SDR</h3><p>最常用的频谱观察,音频解调软件,支持AM、FM、SSB等多种调制方式。<br><a href="http://culmart.com/play/go/aHR0cHM6Ly9haXJzcHkuY29tLw==">https://airspy.com/</a></p><h3 id="RelWithDebInfo"><a href="#RelWithDebInfo" class="headerlink" title="RelWithDebInfo"></a>RelWithDebInfo</h3><p><a href="http://culmart.com/play/go/aHR0cDovL3Nkci5vc21vY29tLm9yZy90cmFjL3Jhdy1hdHRhY2htZW50L3dpa2kvcnRsLXNkci8=">http://sdr.osmocom.org/trac/raw-attachment/wiki/rtl-sdr/</a><br>解压RelWithDebInfo.zip, 把RelWithDebInfo.ziprtl-sdr-releasex32 下的 rtlsdr.dll和libusb-1.0.dll 复制到 SDR# 的目录下。</p><h3 id="重要提示"><a href="#重要提示" class="headerlink" title="重要提示"></a>重要提示</h3><p>理论上完成以上安装就可以开玩。不过,如果显示驱动程序出错的问题,可能需要按照以下步骤安装zadig:</p><p>或者,最保险的方式是执行SDR#目录里面的install-rtlsdr.bat自动安装zadig,以及所需要的RelWithDebInfo。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203202238955.png" alt="install-rtlsdr.bat"></p><h2 id="设置"><a href="#设置" class="headerlink" title="设置"></a>设置</h2><h3 id="zadig-1"><a href="#zadig-1" class="headerlink" title="zadig"></a>zadig</h3><p>go to “Options->List All Devices” and make sure this option is checked. If you are using Windows 10, in some cases you may need to also uncheck “Ignore Hubs or Composite Parents”.</p><p>Select “Bulk-In, Interface (Interface 0)” from the drop down list. Note on some PCs you may see something like RTL2832UHIDIR or RTL2832U instead of the bulk in interface. This is also a valid selection. </p><h3 id="SDR-1"><a href="#SDR-1" class="headerlink" title="SDR"></a>SDR</h3><p>打开SDR#下的SDRSharp.exe</p><p>设置信号源类型。set the “Source” drop down box to ‘RTL-SDR (USB)’.<br>点击开始按钮。Press the Play button (the right facing triangle).<br>调节增益。Don’t forget to also adjust the RF gain settings by pressing the Configure button (looks like a cog) up the top next to the Play button. By default the RF gain is set at zero. A gain of zero will probably receive nothing but very strong broadcast FM - increase the gain until you start seeing other signals.</p><ul><li>rtl-sdr软件大全 <a href="http://culmart.com/play/go/aHR0cHM6Ly93d3cucnRsLXNkci5jb20vYmlnLWxpc3QtcnRsLXNkci1zdXBwb3J0ZWQtc29mdHdhcmUv">https://www.rtl-sdr.com/big-list-rtl-sdr-supported-software/</a></li><li>有关rtl-sdr的专业网站 <a href="http://culmart.com/play/go/aHR0cHM6Ly93d3cucnRsLXNkci5jb20v">https://www.rtl-sdr.com/</a></li></ul><h2 id="RTL-SDR的应用"><a href="#RTL-SDR的应用" class="headerlink" title="RTL-SDR的应用"></a>RTL-SDR的应用</h2><h3 id="在PC上听电台"><a href="#在PC上听电台" class="headerlink" title="在PC上听电台"></a>在PC上听电台</h3><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203202238977.jpeg" alt="b40d47da81cb39db88a8470bd9160924aa18304f.jpg"></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>无线电</tag>
<tag>SDR</tag>
</tags>
</entry>
<entry>
<title>ADB下载使用方法及常用命令</title>
<link href="/2022/03/20/ADB%E4%B8%8B%E8%BD%BD%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E5%8F%8A%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/"/>
<url>/2022/03/20/ADB%E4%B8%8B%E8%BD%BD%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E5%8F%8A%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</url>
<content type="html"><![CDATA[<p>Android 调试桥 (Android Debug Bridge,<code>ADB</code>) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203200848838.png" alt="img"></p><p>它是一种客户端-服务器程序,包括以下三个组件:</p><ul><li><strong>客户端</strong> :用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。</li><li><strong>守护程序 (adbd)</strong> :用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。</li><li><strong>服务器</strong> :用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。</li></ul><h1 id="下载"><a href="#下载" class="headerlink" title="下载"></a>下载</h1><p><strong>SDK Platform-Tools</strong></p><p><a href="https://dl.google.com/android/repository/platform-tools-latest-windows.zip">Windows</a></p><p><a href="https://dl.google.com/android/repository/platform-tools-latest-darwin.zip">Mac</a></p><p><a href="https://dl.google.com/android/repository/platform-tools-latest-linux.zip">Linux</a></p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">注:默认为最新版本<br></code></pre></td></tr></table></figure><h1 id="在设备上启用-adb-调试"><a href="#在设备上启用-adb-调试" class="headerlink" title="在设备上启用 adb 调试"></a>在设备上启用 adb 调试</h1><h2 id="USB-调试"><a href="#USB-调试" class="headerlink" title="USB 调试"></a>USB 调试</h2><p>如要在通过 USB 连接的设备上使用 adb,您必须在设备的系统设置中启用 <strong>USB 调试</strong> (位于<strong>开发者选项</strong> 下)。</p><p>在搭载 Android 4.2 及更高版本的设备上,“开发者选项”屏幕默认情况下处于隐藏状态。如需将其显示出来,请依次转到<strong>设置 > 关于手机</strong> ,然后点按<strong>版本号</strong> 七次。开发者选项便出现在<strong>设置</strong>里面,由于手机运行OS不同,选项位置不一样,请耐心找找。</p><ol><li>进入<strong>platform-tools</strong>解压后的文件夹;</li><li>运行<strong>ADB</strong>软件,手机会弹出是否允许电脑进行调试,选择确认,此时便可以使用。</li></ol><p>注:在<strong>Windows</strong>系统中,直接点击软件是不能运行的,在文件夹中,按住<strong>SHIFT</strong>和<strong>鼠标右键</strong>,选择<strong>在此处打开POWERSHELL</strong>,此时终端就可以运行adb,切记在<strong>adb</strong>命令前添加 **./**,例如 <strong>./adb help</strong></p><h2 id="通过-Wi-Fi-连接到设备(Android-11-及更高版本)"><a href="#通过-Wi-Fi-连接到设备(Android-11-及更高版本)" class="headerlink" title="通过 Wi-Fi 连接到设备(Android 11 及更高版本)"></a>通过 Wi-Fi 连接到设备(Android 11 及更高版本)</h2><p>Android 11 及更高版本支持使用 Android 调试桥 (adb) 从工作站以无线方式部署和调试应用。例如,您可以将可调试应用部署到多台远程设备,而无需通过 USB 实际连接设备。这样就可以避免常见的 USB 连接问题,例如驱动程序安装方面的问题。</p><p>如需使用无线调试,您需要使用配对码将您的设备与工作站配对。您的工作站和设备必须连接到同一无线网络。如需连接到您的设备,请按以下步骤操作:</p><ol><li>在设备上启用<strong>开发者选项</strong>。</li><li>启用<strong>无线调试</strong> 选项。</li><li>在询问<strong>要允许在此网络上进行无线调试吗?</strong> 的对话框中,点击<strong>允许</strong> 。</li><li>选择<strong>使用配对码配对设备</strong> 。记下设备上显示的配对码、IP 地址和端口号(参见图片)。</li></ol><p><a href="https://developer.android.google.cn/studio/images/wireless-adb.png"><img src="https://developer.android.google.cn/studio/images/wireless-adb.png" alt="无线调试"></a></p><ol><li><p>运行终端,使用第 4 步中的地址和端口号替换ipaddr和port</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">adb pair ipaddr:port<br></code></pre></td></tr></table></figure></li><li><p>当系统提示时,输入您在第 5 步中获得的配对码。系统会显示一条消息,表明您的设备已成功配对。</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">none</span><br> <span class="hljs-attribute">Enter</span> pairing code: <span class="hljs-number">482924</span><br> <span class="hljs-attribute">Successfully</span> paired to <span class="hljs-number">192.168.1.130:37099</span><span class="hljs-meta"> [guid=adb-235XY]</span><br></code></pre></td></tr></table></figure></li></ol><hr><h2 id="查询设备"><a href="#查询设备" class="headerlink" title="查询设备"></a>查询设备</h2><p>在发出 adb 命令之前,了解哪些设备实例已连接到 adb 服务器会很有帮助。您可以使用 <code>devices</code> 命令生成已连接设备的列表。</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">adb devices -l</span><br></code></pre></td></tr></table></figure><p>作为回应,adb 会针对每个设备输出以下状态信息:</p><ul><li>序列号:由 adb 创建的字符串,用于通过端口号唯一标识设备。 下面是一个序列号示例:<code>emulator-5554</code></li><li>状态:设备的连接状态可以是以下几项之一:<ul><li><code>offline</code>:设备未连接到 adb 或没有响应。</li><li><code>device</code>:设备现已连接到 adb 服务器。请注意,此状态并不表示 Android 系统已完全启动并可正常运行,因为在设备连接到 adb 时系统仍在启动。不过,在启动后,这将是设备的正常运行状态。</li><li><code>no device</code>:未连接任何设备。</li></ul></li><li>说明:如果您包含<code>-l</code> 选项,<code>devices</code> 命令会告知您设备是什么。当您连接了多个设备时,此信息很有用,可帮助您将它们区分开来。</li></ul><hr><h1 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h1><h2 id="安装应用"><a href="#安装应用" class="headerlink" title="安装应用"></a>安装应用</h2><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cmake">adb <span class="hljs-keyword">install</span> path_to_apk<br></code></pre></td></tr></table></figure><h2 id="查看已装应用列表"><a href="#查看已装应用列表" class="headerlink" title="查看已装应用列表"></a>查看已装应用列表</h2><figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs actionscript">adb shell pm list <span class="hljs-keyword">package</span><br></code></pre></td></tr></table></figure><h2 id="停用应用程序"><a href="#停用应用程序" class="headerlink" title="停用应用程序"></a>停用应用程序</h2><figure class="highlight gauss"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gauss">adb <span class="hljs-built_in">shell</span> pm <span class="hljs-keyword">disable</span>-user+空格+程序名<br></code></pre></td></tr></table></figure><h2 id="启用应用程序"><a href="#启用应用程序" class="headerlink" title="启用应用程序"></a>启用应用程序</h2><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile">adb <span class="hljs-keyword">shell</span><span class="language-bash"> pm <span class="hljs-built_in">enable</span>+空格+程序名</span><br></code></pre></td></tr></table></figure><h2 id="卸载应用程序"><a href="#卸载应用程序" class="headerlink" title="卸载应用程序"></a>卸载应用程序</h2><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs crmsh">adb shell pm uninstall --<span class="hljs-keyword">user</span> <span class="hljs-title">0</span>+空格+程序名<br>此方法可以卸载手机内置应用<br></code></pre></td></tr></table></figure><h2 id="查看电池状态"><a href="#查看电池状态" class="headerlink" title="查看电池状态"></a>查看电池状态</h2><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile">adb <span class="hljs-keyword">shell</span><span class="language-bash"> dumpsys battery</span><br></code></pre></td></tr></table></figure>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>ADB</tag>
<tag>安卓</tag>
</tags>
</entry>
<entry>
<title>使用树莓派3b和RTL_SDR搭建无线电监测点</title>
<link href="/2022/03/17/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE3b%E5%92%8CRTL-SDR%E6%90%AD%E5%BB%BA%E6%97%A0%E7%BA%BF%E7%94%B5%E7%9B%91%E6%B5%8B%E7%82%B9/"/>
<url>/2022/03/17/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE3b%E5%92%8CRTL-SDR%E6%90%AD%E5%BB%BA%E6%97%A0%E7%BA%BF%E7%94%B5%E7%9B%91%E6%B5%8B%E7%82%B9/</url>
<content type="html"><![CDATA[<h2 id="SDR-是个什么东西?"><a href="#SDR-是个什么东西?" class="headerlink" title="SDR 是个什么东西?"></a>SDR 是个什么东西?</h2><blockquote><p>“软件无线电”( Software Defined Radio – SDR )。实际上软件无线电技术的研究和开发已经有几十年的历史了,其中传统上以硬件实现的组件(例如混频器,滤波器,放大器,调制器\解调器,检测器等),通过个人计算机或嵌入式系统上的软件实现。最初源于美军的多制式电台项目,应用在军事领域。<br>在 21 世纪初,由于众多公司的努力,使得它已从军事领域转向民用领域,成为经济的、应用广泛的、全球第三代移动通信系统的战略基础。<br>到今天我们日常使用的移动通信系统中就在大量使用软件无线电技术, 比如基站中的信号处理大量的使用可编程的 FPGA 和 DSP 完成,比如手机当中的基带处理器也越来越多的采用软解调的方法(少数运算量特别大实时性要求特别高的模块除外,比如 turbo 解码器、扩频相关器等,这些模块往往在基带处理器中嵌入一些高度定制化”硬”核来实现)。</p></blockquote><p>所以我们想要监听周围的无线电信号,自然是需要一个硬件的。</p><h2 id="需要的硬件"><a href="#需要的硬件" class="headerlink" title="需要的硬件"></a>需要的硬件</h2><ul><li>RTL-SDR (或者 HackRF等)</li><li>Raspberry Pi 3(32位系统) (或者 Linux 系统的电脑)</li><li>有网络</li><li>高频天线</li></ul><p>我选择的是一根支持 rtl-sdr 的电视棒,就是采用 RTL2832u (频率范围为 64-1700mh )解调芯片的。这是瑞晟( Realtek )的一个芯片型号,原本是做电视棒芯片的。后来被人发现这个芯片具有非常广的频率接收范围,然后就被用来做 sdr 应用了。十分廉价!</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203200841344.png" alt="RTL-SDR"></p><h2 id="安装-RTL-SDR-驱动程序"><a href="#安装-RTL-SDR-驱动程序" class="headerlink" title="安装 RTL_SDR 驱动程序"></a>安装 RTL_SDR 驱动程序</h2><p>硬件已经有了,接下来就是安装相关的软件驱动,才可以使用</p><figure class="highlight brainfuck"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs brainfuck"><span class="hljs-comment">sudo apt install rtl-sdr librtlsdr</span><span class="hljs-literal">-</span><span class="hljs-comment">dev</span><br></code></pre></td></tr></table></figure><p>创建文件夹并进入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">mkdir</span> spyserver<br><span class="hljs-built_in">cd</span> spyserver<br></code></pre></td></tr></table></figure><p>下载软件并解压</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs awk">wget -O spyserver.tgz http:<span class="hljs-regexp">//</span>airspy.com/?ddownload=<span class="hljs-number">4247</span><br>tar xvzf spyserver.tgz<br></code></pre></td></tr></table></figure><p>使用像nano这样的文本编辑器来编辑spyserver.config文件。将”device_type”更改为”device_type = RTL-SDR”(不带引号)。</p><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">nano spyserver.config<br></code></pre></td></tr></table></figure><p>测试程序</p><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">./spyserver spyserver.config<br></code></pre></td></tr></table></figure><p>正常运行截图</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203200840214.jpeg" alt="img"></p><p>使用网络连接 spyserver 后的 SDRSharp 软件中 NFW 与WFM 带宽 会被限制 需要修改 SDRSharp客户端目录下 SDRSharp.exe.Config中 </p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><<span class="hljs-built_in">add</span> <span class="hljs-attribute">key</span>=<span class="hljs-string">"minReducedNarrowBandwidth"</span> <span class="hljs-attribute">value</span>=<span class="hljs-string">"12500"</span> /><br><<span class="hljs-built_in">add</span> <span class="hljs-attribute">key</span>=<span class="hljs-string">"minReducedWideBandwidth"</span> <span class="hljs-attribute">value</span>=<span class="hljs-string">"150000"</span> /><br></code></pre></td></tr></table></figure><h2 id="开机自启"><a href="#开机自启" class="headerlink" title="开机自启"></a>开机自启</h2><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">vi <span class="hljs-regexp">/usr/</span>lib<span class="hljs-regexp">/systemd/</span>system/spyserver.service<br></code></pre></td></tr></table></figure><p>添加下面的内容</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[Unit]</span><br><span class="hljs-attr">Description</span>=spyserver<br> <br><span class="hljs-section">[Service]</span><br><span class="hljs-attr">ExecStart</span>=/root/spyserver/spyserver /root/spyserver/spyserver.config <span class="hljs-comment">#根据你的位置修改</span><br><span class="hljs-attr">Restart</span>=<span class="hljs-literal">on</span>-abnormal<br><span class="hljs-attr">RestartSec</span>=<span class="hljs-number">10</span>s<br><span class="hljs-attr">KillMode</span>=mixed<br> <br><span class="hljs-section">[Install]</span><br><span class="hljs-attr">WantedBy</span>=multi-user.target<br><br></code></pre></td></tr></table></figure><p>设置开机自启动</p><figure class="highlight nsis"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs nsis"><span class="hljs-comment"># 更新配置</span><br><span class="hljs-params">system</span>ctl daemon-reload<br> <br><span class="hljs-comment"># 启动服务</span><br><span class="hljs-params">system</span>ctl start spyserver.service<br> <br><span class="hljs-comment"># 设置开机启动</span><br><span class="hljs-params">system</span>ctl enable spyserver.service<br></code></pre></td></tr></table></figure><p>然后打开你的SDR软件就可以收听了哦</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/202203200843798.png" alt="image-20220320084259416"></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>树莓派</tag>
<tag>无线电</tag>
</tags>
</entry>
<entry>
<title>FileBrowser安装及使用</title>
<link href="/2022/02/12/FileBrowser%E5%AE%89%E8%A3%85%E5%8F%8A%E4%BD%BF%E7%94%A8/"/>
<url>/2022/02/12/FileBrowser%E5%AE%89%E8%A3%85%E5%8F%8A%E4%BD%BF%E7%94%A8/</url>
<content type="html"><![CDATA[<p>大家如果想随时随地查看和修改文件,一般会选择将文件保存至网盘,很方便,而且空间还比较大。但是由于国内的网盘环境现在比较差,再加上我们不可能把所有文件都搬上网盘,那就需要另一种解决方案了。</p><p>这就是让我们可以直接访问我们家里或者公司里的设备,直接对设备上的文件进行操作。如果在以前,这种方案并不是人人都可以做到的,因为如果你想直接访问设备,就需要设备有公网 IP 或者做内网穿透,否则是无法随时随地访问设备的。</p><p>但是随着 IPv6 的普及,我们已经可能做到每台设备都有一个公网 IPv6 地址,虽然它不是固定的,不过你只需要一个域名,配置下 DDNS ,就可以随时随地的访问你的设备了。</p><p>这对于家里有 NAS 或者是有个小型存储设备的人来说,就不需要再依靠网盘来随时随地的访问文件了</p><p>今天给大家带来一个简单易用的文件管理程序:<strong>File Browser</strong></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/index.png" alt="File Browser"></p><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>File Browser 是一个基于 Web 的文件管理器。它可以使你随时随地的对设备的文件进行基本的管理操作,如:创建、删除、移动、复制等。它除了可以让你进行文件管理之外,还有一些其他的功能。它支持多个用户的管理,而且每个用户可以拥有自己可以访问的文件和权限。它还支持文件分享,就行网盘那样,你可以通过它来向你的朋友分享文件。你还可以用它来执行一些 Linux 命令,比如你想要在当前目录下克隆一个代码库,就可以用它来执行<code>git</code>等命令。</p><h2 id="安装及配置"><a href="#安装及配置" class="headerlink" title="安装及配置"></a>安装及配置</h2><p>File Browser 适用于全平台,任何操作系统都可以安装它,当然,我会以 Linux 为主。</p><p>File Browser 在 Linux 的安装非常简单,可以手动下载可执行文件进行安装:</p><p><a href="https://github.com/filebrowser/filebrowser/releases/latest">https://github.com/filebrowser/filebrowser/releases/latest</a></p><p>当安装好之后,你并不能立即使用它,需要修改一些配置。</p><p><strong>以下设置方法只适用 File Browser 2.0 +</strong></p><p>创建配置数据库:<code>filebrowser -d /etc/filebrowser.db config init</code></p><p>设置监听地址:<code>filebrowser -d /etc/filebrowser.db config set --address 0.0.0.0</code></p><p>设置监听端口:<code>filebrowser -d /etc/filebrowser.db config set --port 8088</code></p><p>设置语言环境:<code>filebrowser -d /etc/filebrowser.db config set --locale zh-cn</code></p><p>设置日志位置:<code>filebrowser -d /etc/filebrowser.db config set --log /var/log/filebrowser.log</code></p><p>添加一个用户:<code>filebrowser -d /etc/filebrowser.db users add root password --perm.admin</code>,其中的<code>root</code>和<code>password</code>分别是用户名和密码,根据自己的需求更改。</p><p>有关更多配置的选项,可以参考官方文档:<a href="https://filebrowser.org/">Welcome - File Browser</a></p><p>配置修改好以后,就可以启动 File Browser 了,使用<code>-d</code>参数指定配置数据库路径。示例:<code>filebrowser -d /etc/filebrowser.db</code></p><p>启动成功就可以使用浏览器访问 File Browser 了,在浏览器输入 IP:端口,示例:<a href="http://192.168.1.1:8088/">http://192.168.1.1:8088</a></p><p>然后会看到 File Browser 的登陆界面,用刚刚创建的用户登陆。</p><p>登陆以后,默认会看到 File Browser 运行目录下的文件,需要更改一下当前用户的文件夹位置。</p><p>点击 [设置] → [用户设置] → 编辑用户 admin → 将目录范围改为你想要显示的文件夹,例如:/mnt → 修改完成后点击最下方的保存即可。</p><p>这样,File Browser 的基本安装和配置就搞定了。</p><p><a href="https://cdn.mivm.cn/www.mivm.cn/archives/filebrowser/01.jpg"><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/01.jpg" alt="filebrowser"></a></p><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h4 id="后台运行"><a href="#后台运行" class="headerlink" title="后台运行"></a>后台运行</h4><p>File Browser 默认是前台运行,如何让它后台运行呢?</p><p>第一种是 nohup 大法:</p><p>运行:<code>nohup filebrowser -d /etc/filebrowser.db >/dev/null 2>&1 &</code></p><p>停止运行:<code>kill -9 $(pidof filebrowser)</code></p><p>开机启动:<code>sed -i '/exit 0/i\nohup filebrowser -d \/etc\/filebrowser.db >\/dev\/null 2>&1 &' /etc/rc.local</code></p><p>取消开机启动:<code>sed -i '/nohup filebrowser -d \/etc\/filebrowser.db >\/dev\/null 2>&1 &/d' /etc/rc.local</code></p><p>第二种是 systemd 大法:</p><p>首先添加File Browser 的 service 文件:</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[Unit]</span><br><span class="hljs-attr">Description</span>=The filebrowser Process Manager<br><span class="hljs-attr">After</span>=network.target<br><br><span class="hljs-section">[Service]</span><br><span class="hljs-attr">Type</span>=simple<br><span class="hljs-attr">ExecStart</span>=/root/file/filebrowser -a <span class="hljs-number">0.0</span>.<span class="hljs-number">0.0</span><br><span class="hljs-attr">ExecStop</span>=/bin/killall filebrowser<br><span class="hljs-attr">PrivateTmp</span>=<span class="hljs-literal">true</span><br><br><span class="hljs-section">[Install]</span><br><span class="hljs-attr">WantedBy</span>=multi-user.target<br></code></pre></td></tr></table></figure><p>到<code>/lib/systemd/system/filebrowser.service</code></p><p>如果你的运行命令不是<code>/usr/local/bin/filebrowser -d /etc/filebrowser.db</code>,需要对 service 文件进行修改,将文件的 ExecStart 改为你的运行命令,更改完成后需要输入<code>systemctl daemon-reload</code>。</p><p>运行:<code>systemctl start filebrowser.service</code></p><p>停止运行:<code>systemctl stop filebrowser.service</code></p><p>开机启动:<code>systemctl enable filebrowser.service</code></p><p>取消开机启动:<code>systemctl disable filebrowser.service</code></p><p>查看运行状态:<code>systemctl status filebrowser.service</code></p><p>我推荐使用 systemd 的方法来后台运行,当然,前提是你所使用的操作系统支持 systemd。</p><h4 id="HTTPS"><a href="#HTTPS" class="headerlink" title="HTTPS"></a>HTTPS</h4><p>File Browser 2.0 起开始内建 HTTPS 支持,只需要配置 SSL 证书即可。</p><p>配置 SSL:<code>filebrowser -d /etc/filebrowser.db config set --cert example.com.crt --key example.com.key</code>,其中<code>example.com.crt</code>和<code>example.com.key</code>分别是 SSL 证书和密钥路径,根据自身情况进行更改。配置完 SSL 后,只可以使用 HTTPS 访问,不可以使用 HTTP。</p><p>取消 SSL:<code>filebrowser -d /etc/filebrowser.db config set --cert "" --key ""</code></p><p>当然,你也可以使用 Nginx 等 Web 服务器对 File Browser 进行反向代理,以达到 HTTPS 访问的目的。</p><p>还有就是使用 Caddy,这是一个开源、支持 HTTP/2 的 Web 服务器,它的一个显著特点就是默认启用 HTTPS 访问,会自己申请 SSL 证书,同时支持大量的插件,File Browser 就可以作为其插件运行。</p><h4 id="外网访问"><a href="#外网访问" class="headerlink" title="外网访问"></a>外网访问</h4><p>每个人的情况不同,外网访问的配置方法也不一样。</p><p>如果你有公网 IP 地址,不管是 v4 还是 v6,在防火墙上打开相应的端口以及设置好端口转发即可。</p><p>如果你没有公网IP地址,那么你想要外网访问可能就需要内网穿透了</p><p>当然你还可以使用Docker搭建(参考官方文档)</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>FileBrowser</tag>
<tag>Nas</tag>
</tags>
</entry>
<entry>
<title>科学上网:使用X-UI面板快速搭建多协议、多用户代理服务,支持CDN</title>
<link href="/2022/02/04/%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%EF%BC%9A%E4%BD%BF%E7%94%A8X-UI%E9%9D%A2%E6%9D%BF%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E5%A4%9A%E5%8D%8F%E8%AE%AE%E3%80%81%E5%A4%9A%E7%94%A8%E6%88%B7%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%EF%BC%8C%E6%94%AF%E6%8C%81CDN/"/>
<url>/2022/02/04/%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%EF%BC%9A%E4%BD%BF%E7%94%A8X-UI%E9%9D%A2%E6%9D%BF%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E5%A4%9A%E5%8D%8F%E8%AE%AE%E3%80%81%E5%A4%9A%E7%94%A8%E6%88%B7%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%EF%BC%8C%E6%94%AF%E6%8C%81CDN/</url>
<content type="html"><![CDATA[<p><img src="https://coderfan.net/wp-content/uploads/2021/07/XUI%E7%99%BB%E5%BD%95%E7%95%8C%E9%9D%A2.png" alt="img"></p><p>使用代理服务进行科学上网,重要的是代理服务端的搭建。在我们搭建过程中,往往需要依照自身情况选择适合自己的搭建方式。如采用官方推荐的脚本进行安装,但官方推荐的脚本一般都对新手不够友好,常常需要自行拓展方可安装成功。也有各路大神实现的多合一一键安装脚本,这些脚本在一定程度上降低了新手搭建服务端的难度。此外还有一类搭建方法,那就是通过面板来搭建。</p><p>使用面板来搭建,好处在于:<strong>由于拥有UI界面,信息展示相当直观,更便于我们新手操作(无需命令行)</strong>。那么今天我们就来介绍一下使用X-UI来搭建我们的代理服务。</p><p>使用X-UI搭建代理服务,具有以下优点:</p><ul><li><strong>支持系统状态监控:如CPU、内存、硬盘等状态</strong></li><li><strong>支持多用户多协议,网页可视化操作</strong></li><li><strong>支持流量统计</strong></li><li><strong>支持自定义Xray配置模板</strong></li><li><strong>支持HTTPS访问面板</strong></li><li><strong>支持面板自定义端口,账号与密码</strong></li><li><strong>快速生成分享连接或二维码</strong></li><li><strong>支持CDN套用</strong></li><li><strong>支持Fallback分流设置</strong></li></ul><h3 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h3><ul><li>VPS</li><li>域名</li><li>Cloudfare账号</li><li>ZeroSSL账号</li><li>Github</li></ul><p>这里需要注意的是,我们注册好的域名必须要先在Cloudfare内增加A记录,方便我们申请SSL证书。</p><p>如果不知道如何添加A记录,请各位自行Google。</p><h3 id="开始搭建"><a href="#开始搭建" class="headerlink" title="开始搭建"></a>开始搭建</h3><ul><li><strong>使用Github进入X-UI官方仓库:<a href="https://github.com/sprov065/x-ui">https://github.com/sprov065/x-ui</a></strong></li></ul><p>复制官方推荐的脚本:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">bash <(curl -Ls https:<span class="hljs-regexp">//</span>raw.githubusercontent.com<span class="hljs-regexp">/sprov065/</span>x-ui<span class="hljs-regexp">/master/i</span>nstall.sh) <span class="hljs-number">0.2</span>.<span class="hljs-number">0</span><br></code></pre></td></tr></table></figure><ul><li>将上述代码复制到你的VPS内执行,<strong>如果提示未安装curl工具,请先安装curl工具</strong></li></ul><p>执行完成后,我们应该能看到以下输出内容</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn@main/img/%25E5%25AE%2589%25E8%25A3%2585%25E7%25BB%2593%25E6%259E%259C-1024x505.png">安装完成示意图</p><p>面板安装完成后我们在/usr/local/x-ui内可以找到关于面板的配置内容。</p><ul><li><strong>进入Cloudfare官方网站,新增A记录(子域名),指向VPS的IP地址</strong></li></ul><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/A%E8%AE%B0%E5%BD%95-1024x462.png" alt="img">添加A记录</p><p>请注意,添加后先不要开启代理,仅限DNS解析。怎样判断是否开启CDN代理呢?很简单,代理状态下方有一片云朵,橙色云朵代表开启CDN,灰色云朵代表仅限DNS解析。</p><p>添加完成后,我们打开新的网页,在网址输入栏内输入你的<strong>域名:54321</strong>(面板初始端口),回车后即可进入到我们的登录界面。</p><p>登录界面是这个样子的:</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/XUI%E7%99%BB%E5%BD%95%E7%95%8C%E9%9D%A2-1024x441.png" alt="img">X-UI登录界面</p><p>我们使用默认的用户名与密码登录,即可进入X-UI的设置界面:</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/%E8%AE%BE%E7%BD%AE%E7%95%8C%E9%9D%A2-1024x311.png" alt="img">设置界面</p><p>建议登录之后在立即在<strong>面板设置</strong>内重置面板端口与用户名、登录密码,然后重启面板。</p><ul><li><strong>新建节点</strong></li></ul><p>点击<strong>“入站列表”</strong>,新增入站节点:</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/%E5%85%A5%E7%AB%99%E8%8A%82%E7%82%B9-1024x317.png" alt="img">增加入站节点</p><p>进行节点设置:</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/image-1-1024x517.png" alt="img">节点设置</p><p>如果没有套CDN或其他需求,可以不做其他设置,点击“<strong>添加</strong>”完成添加节点。</p><ul><li><strong>获取链接或者二维码</strong></li></ul><p>添加节点后,我们点击<strong>查看</strong>,点击右下方复制连接获取连接。在V2rayN客户端内添加即可。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/image-2.png" alt="img">获取链接</p><p>获取二维码,点击二维码图标即可</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/image-3-1024x221.png" alt="img">获取二维码</p><p>至此,使用X-UI搭建的流程就完成了。</p><p><strong>需要说明的是,以上步骤搭建完成后并不支持CDN套用。</strong>如果想支持CDN套用,则继续参考以下步骤</p><h3 id="CDN套用"><a href="#CDN套用" class="headerlink" title="CDN套用"></a>CDN套用</h3><p>如果需要支持CDN套用,还需要申请一套SSL证书。这一套证书实际上是用于你的子域名的认证的,请不要与主域名的证书混淆!</p><p>在这里我们使用ACME来申请证书。需要说明的是,ACME申请的证书CA方默认为ZeroSSL,需要先去ZeroSSL官网进行注册才能使用。</p><p><strong>2021.11.06更新:</strong></p><p>经实际验证,无需事先在ZeroSSL官网进行注册,使用acme脚本初次申请ZeroSSL证书时会要求个人输入account与password,也可以完成注册。</p><ul><li><strong>安装ACME工具:</strong></li></ul><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs vim">curl https://<span class="hljs-built_in">get</span>.acme.<span class="hljs-keyword">sh</span> | <span class="hljs-keyword">sh</span><br></code></pre></td></tr></table></figure><p>安装后,会在root目录下生成.acme.sh这样的文件夹,使用ls -la命令可以查看。</p><ul><li><strong>设置Cloudfare API:</strong></li></ul><p>登录Cloudfare官网,在左下角的API区域,点击<strong>“获取您的API令牌”</strong></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/AP%E4%BB%A4%E7%89%8C-1024x574.png" alt="img">API令牌</p><p>点击之后进入二级页面,点击API令牌,找到API密钥下方的Global API Key,进行查看</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/%E6%9F%A5%E7%9C%8BAPI-1024x499.png" alt="img">查看API令牌</p><p>请将这份API Key复制到你本地。输入以下命令导入环境变量(复制粘贴时请自行去除掉//及之后的内容,在本教程中仅为了注释,实际使用时不需要//及之后的内容):</p><p>export CF_Key=”***********************” //Global API key</p><p>export CF_Email=<a href="mailto:[email protected]">***************.com</a> //Cloudfare 注册邮箱</p><ul><li><strong>申请、安装证书:</strong></li></ul><p>使用以下命令</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs gradle">~<span class="hljs-regexp">/.acme.sh/</span>acme.sh --issue --dns dns_cf -d YourDomain -d *.YourDomain<br>mkdir <span class="hljs-regexp">/root/</span>cert<br>~<span class="hljs-regexp">/.acme.sh/</span>acme.sh --installcert -d YourDomian --key-<span class="hljs-keyword">file</span> <span class="hljs-regexp">/root/</span>cert<span class="hljs-regexp">/private.key --fullchain-file /</span>root<span class="hljs-regexp">/cert/</span>cert.crt<br>~<span class="hljs-regexp">/.acme.sh/</span>acme.sh --upgrade --auto-upgrade<br>chmod -R <span class="hljs-number">755</span> <span class="hljs-regexp">/root/</span>cert<br></code></pre></td></tr></table></figure><p>安装成功如下图提示:</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/%E8%AF%81%E4%B9%A6%E5%AE%89%E8%A3%85-1-1024x239.png" alt="img">证书安装</p><p>安装好证书后,我们就可以设置开启TLS套用CDN了。</p><p><strong>2021.09.01更新:</strong></p><p>由于acme脚本变更了默认CA方为ZeroSSL,而ZeroSSL存在证书数量的限制(除非加钱),建议大家切换为Let‘sEncrypt的证书。切换方式:</p><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata">~/.acme.<span class="hljs-keyword">sh</span>/acme.<span class="hljs-keyword">sh</span> --<span class="hljs-keyword">set</span>-default-<span class="hljs-keyword">ca</span> --server letsencrypt<br></code></pre></td></tr></table></figure><p>切换为Let’s Encrypt后,安装证书的命令相应地做变更:</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gradle">~<span class="hljs-regexp">/.acme.sh/</span>acme.sh --installcert -d YourDomain -d *.YourDomain --ca-<span class="hljs-keyword">file</span> <span class="hljs-regexp">/root/</span>cert<span class="hljs-regexp">/ca.cer --cert-file /</span>root<span class="hljs-regexp">/cert/Y</span>ourDomain.cer --key-<span class="hljs-keyword">file</span> <span class="hljs-regexp">/root/</span>cert<span class="hljs-regexp">/YourDomain.key --fullchain-file /</span>root<span class="hljs-regexp">/cert/</span>fullchain.cer<br></code></pre></td></tr></table></figure><p>注: <strong>YourDomain</strong> 代表你自己的域名。</p><ul><li><strong>设置TLS</strong></li></ul><p>进入面板界面,添加入站节点,设置如下:</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/%E5%BC%80%E5%90%AFtls.png" alt="img"></p><p>设置过程中需要注意的点:</p><p><strong>1.端口需要是Cloudfare支持分发的端口,如443等</strong></p><p><strong>2.套用CDN需要搭配WebSocket,请在传输设置项呢选择ws</strong></p><p>3**.ws路径可随意,但最好不要为根路径**</p><p><strong>4.公钥文件路径与密钥文件路径请根据你证书安装的实际位置进行填写</strong></p><p><strong>5.在使用证书与密钥时,除了设置路径也可以通过填入certificate file content的内容达到使用的目的</strong></p><p>添加节点后,我们回到Cloudflare,将灰色云朵置为橙色。然后我们回到VPS侧,使用ping +域名查看IP是否变更,如果不再为我们VPS的IP,则表明已经成功套用CDN。</p><ul><li><strong>开启证书自动更新</strong></li></ul><p>本身acme脚本提供了自动更新证书的功能,证书在90天到期后会自动更新,我们需要开启该功能,这样可以保证我们的证书一直不过期,自动更新证书需要使用如下命令:</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stylus">~/<span class="hljs-selector-class">.acme</span>.sh/acme<span class="hljs-selector-class">.sh</span> <span class="hljs-attr">--upgrade</span> <span class="hljs-attr">--auto-upgrade</span><br></code></pre></td></tr></table></figure><h3 id="面板套用CDN"><a href="#面板套用CDN" class="headerlink" title="面板套用CDN"></a>面板套用CDN</h3><p>除了我们搭建的节点可以套用CDN,我们的X-UI面板也支持套用CDN。如果需要X-UI面板也套用CDN,我们需要在面板内修改面板监听的端口为Cloudflare支持的端口,同时设置SSL证书密钥路径。<strong>在这里需要注</strong>意,<strong>面板的监听端口一定不要与你的节点共用同一端口。</strong></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/%E9%9D%A2%E6%9D%BF%E7%AB%AF%E5%8F%A3-1024x399.png" alt="img">更改面板设置</p><p>设置完以后记得重启面板,重新输入:<strong>https://域名+端口</strong>,正常进入面板界面。同时我们会发现我们的网页已经是安装加密的。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/image-4.png" alt="img"></p><p>至此,面板也支持套用CDN了。</p><p>以上就是X-UI使用的整个教程,大家可以依照教程自行进行测试使用,如有问题可以在评论区与我沟通。本人在搭建完成后进行了一天的使用,总体使用下来还是非常方便快捷的,很适合新手使用。在这里也要感谢X-UI的开发者们,是他们无私的付出才给我们带来了如此好用的工具,Respect!</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>科学上网</tag>
<tag>X-ui</tag>
</tags>
</entry>
<entry>
<title>Searx:搭建私人的搜索引擎平台,可展现Google/Bing等70多种搜索网站的搜索结果</title>
<link href="/2021/12/30/Searx%EF%BC%9A%E6%90%AD%E5%BB%BA%E7%A7%81%E4%BA%BA%E7%9A%84%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E5%B9%B3%E5%8F%B0%EF%BC%8C%E5%8F%AF%E5%B1%95%E7%8E%B0Google-Bing%E7%AD%8970%E5%A4%9A%E7%A7%8D%E6%90%9C%E7%B4%A2%E7%BD%91%E7%AB%99%E7%9A%84%E6%90%9C%E7%B4%A2%E7%BB%93%E6%9E%9C/"/>
<url>/2021/12/30/Searx%EF%BC%9A%E6%90%AD%E5%BB%BA%E7%A7%81%E4%BA%BA%E7%9A%84%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E5%B9%B3%E5%8F%B0%EF%BC%8C%E5%8F%AF%E5%B1%95%E7%8E%B0Google-Bing%E7%AD%8970%E5%A4%9A%E7%A7%8D%E6%90%9C%E7%B4%A2%E7%BD%91%E7%AB%99%E7%9A%84%E6%90%9C%E7%B4%A2%E7%BB%93%E6%9E%9C/</url>
<content type="html"><![CDATA[<p>官网:<a href="https://haohe.fun/go?_=0c18f71d5baHR0cHM6Ly9zZWFyeC5naXRodWIuaW8vc2Vhcngv">https://searx.github.io/searx/</a></p><p>Searx一个基于Python的完全开源免费搜索引擎平台,为你提供来自Google、Bing、Yahoo等70多种各大视频、图片、搜索、磁力等网站结果展示,并对搜索结果进行优化,同时不会存储你的任何搜索信息。</p><p>网站 <a href="https://haohe.fun/go?_=e449f1a86caHR0cHM6Ly9zZWFyeC5zcGFjZS8=">https://searx.space/</a> 里面收录了目前基于「Searx」搭建的搜索引擎网站,里面显示了搭建的版本、TLS、服务器所在地、证书、是否支持 IPv6 等。大家自行选择打开速度比较快的网站就可以了。</p><h4 id="运行截图"><a href="#运行截图" class="headerlink" title="运行截图"></a>运行截图</h4><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211230094258.png" alt="%title插图%num"></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211230094312.png" alt="%title插图%num"></p><h3 id="安装教程"><a href="#安装教程" class="headerlink" title="安装教程"></a>安装教程</h3><h4 id="Docker-安装"><a href="#Docker-安装" class="headerlink" title="Docker 安装"></a>Docker 安装</h4><h5 id="安装Docker"><a href="#安装Docker" class="headerlink" title="安装Docker"></a>安装Docker</h5><p>首先<a href="https://docs.docker.com/engine/install/">安装Docker</a>,可以使用官方脚本安装:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sh">curl -fsSL https://get.docker.com -o get-docker.sh<br>sudo sh get-docker.sh<br></code></pre></td></tr></table></figure><p>如果你当前不是root用户,执行以下命令使你每次使用docker时不必加上sudo:<br>(将<code><your-user></code>换为你当前的用户名)</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs xml">sudo usermod -aG docker <span class="hljs-tag"><<span class="hljs-name">your-user</span>></span><br></code></pre></td></tr></table></figure><h5 id="获取Docker镜像"><a href="#获取Docker镜像" class="headerlink" title="获取Docker镜像"></a>获取Docker镜像</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker pull searx/searx<br></code></pre></td></tr></table></figure><h5 id="启动镜像"><a href="#启动镜像" class="headerlink" title="启动镜像"></a>启动镜像</h5><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile">docker <span class="hljs-keyword">run</span><span class="language-bash"> --<span class="hljs-built_in">rm</span> -d -v <span class="hljs-variable">${PWD}</span>/searx:/etc/searx -p 80:8080 searx/searx</span><br></code></pre></td></tr></table></figure><p>简单解释一下这个命令:<code>run</code>运行一个容器;<code>--rm</code>表示容器停止后即删除;<code>-d</code>后台运行;<code>-v</code>共享文件系统,这里指当前目录的searx文件夹能够访问容器内的/etc/searx目录;<code>-p</code>映射端口,如果你想用其他端口访问这个容器,将80改为你想要的端口即可</p><p><code>docker ps</code>可以查看当前运行的容器,你能看到容器的CONTAINER ID。<br><code>docker kill id</code>id替换为CONTAINER ID,强制关闭容器,又因为上面提到的–rm参数,关闭后即被删除。</p><p>接着编辑配置 <code>vim searx/settings.yml</code></p><p>(这个文件在/root/searx下)</p><p>修改base_url为 https://你的域名/ ,Ctrl+O并回车保存,Ctrl+X退出编辑器。</p><p>再通过上面的docker run命令启动容器。</p><h2 id="配置https"><a href="#配置https" class="headerlink" title="配置https"></a>配置https</h2><p>推荐将域名托管在Cloudflare,将你的域名指向你的VPS IP,将小云朵点亮,这样即使你的VPS被墙也能够正常被访问。注意将SSL安全设置为Flexible,因为VPS并未配置证书。</p><p>点击Page Rules(页面规则),创建两个页面规则(以quickso.eu.org为例):<br>①<br><a href="http://quickso.eu.org/">http://quickso.eu.org/</a><br>转发URL,301重定向<br><a href="https://quickso.eu.org/">https://quickso.eu.org/</a><br>②<br><a href="http://quickso.eu.org/">http://quickso.eu.org/</a>*<br>自动HTTPS重写</p><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>你可以进入设置来自定义你的搜索体验。</p><p>如果无法获取Google的结果,很可能是你VPS的IP被谷歌拉黑了。</p><p>内存不足可以设置/增加swap。根据你的VPS性能,自行斟酌是否要将网址公开或分享给好友使用,防止被判定为滥用。</p><h4 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h4><p><a href="https://quickso.eu.org/">searx (quickso.eu.org)</a></p><h2 id=""><a href="#" class="headerlink" title=""></a></h2>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Searx</tag>
</tags>
</entry>
<entry>
<title>Kiwi浏览器使用手册</title>
<link href="/2021/12/29/Kiwi%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/"/>
<url>/2021/12/29/Kiwi%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/</url>
<content type="html"><![CDATA[<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><h4 id="1-什么是Kiwi浏览器?"><a href="#1-什么是Kiwi浏览器?" class="headerlink" title="1 什么是Kiwi浏览器?"></a>1 什么是Kiwi浏览器?</h4><p><strong>Kiwi Browser</strong>是一款支持扩展的安卓浏览器,比起Chrome浏览器手机版,这款浏览器或许会成为安卓上最好用的浏览器。Kiwi Browser是基于Chromium内核二次开发的浏览器,它引入了对Chrome扩展的支持,你可以将一些拓展程序安装在手机上</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101021.png"></p><p><strong>Kiwi浏览器</strong>主要面向高阶用户,具有内置广告拦截器、加密劫持保护等功能,但该浏览器最大的特色就是能够在移动设备上安装那些原本就支持 <strong>Chrome</strong> 的扩展程序,虽然不能做到 100% 全兼容,但它也是目前市面上少数几款基于 <strong>Chromium</strong> 并且支持安装扩展程序的 Android 浏览器。<br>由于该浏览器仅有一名开发者负责开发和维护,这就导致该浏览器更新的频率不高,并且底层的 <strong>Chromium</strong> 版本与官方版本不同步。而市面上其他基于 <strong>Chromium</strong> 的浏览器,如 Chrome、Edge、Vivaldi、Opera 和 Brave 都背靠大公司,产品开发人员通常达到数百人的规模,显然在这方面独立开发者处于了不利地位。<br>随着 <strong>Chromium</strong> 将发布周期从 6 周转为 4 周,以及 Chrome 和 Edge 等浏览器也将跟随这一变化,未来情况可能会变得更加糟糕。<br>为了解决这个问题,使 <strong>Kiwi Browser</strong>紧跟 <strong>Chromium</strong> 的发布,Kiwi 开发者将使用自动化工具和脚本来跟上 <strong>Chromium</strong> 的 4 周发布周期。这有望使 Kiwi 与最新的 <strong>Chromium</strong> 版本保持同步,这样用户就不必错过关键的错误修复或新的浏览器功能。<br>对于一个独立开发者维护的项目而言,要想遵循原本的 6 周发布周期就已经是一项艰难的任务了。考虑到更新内容和后续的测试,改为 4 周的发布周期给开发者带来了更大的压力。<br>如果这样的开发流程效果还不错的话,Kiwi 浏览器将会得到更频繁的更新,这将使它在安全、稳定和兼容方面有很大提升,再加上对更多扩展的支持i,有望可以看到该浏览器在未来几年获得更多用户的青睐。</p><h4 id="相关信息"><a href="#相关信息" class="headerlink" title="相关信息"></a>相关信息</h4><p>官方网站:<a href="user_cancel">https://kiwibrowser.com/</a><br><strong>中文网站:</strong><a href="https://kiwibrowser.pages.dev/"><strong>https://kiwibrowser.pa</strong></a><br><a href="https://kiwibrowser.pages.dev/"><strong>ges.dev/</strong></a><br>Kiwi浏览器官方Discord:<a href="https://discord.gg/b6hVz26">https://discord.gg/b6hVz26</a><br>Kiwi浏览器Telegram群:<a href="https://t.me/kiwibrowserchat">https://t.me/kiwibrowserchat</a><br><strong>Kiwi浏览器中文QQ群:219360203</strong></p><h4 id="2-下载地址"><a href="#2-下载地址" class="headerlink" title="2 下载地址"></a>2 下载地址</h4><p>谷歌play商店:<br><a href="https://play.google.com/store/apps/details?Id=com.kiwibrowser.browser">https://play.google.com/store/apps/details?Id=com.kiwibrowser.browser</a><br>Apkpure:<br><a href="https://m.apkpure.com/cn/kiwi-brokiwibrowser.pages.devwser-fast-quiet/com.kiwibrowser.browser">https://m.apkpure.com/cn/kiwi-brokiwibrowser.pages.devwser-fast-quiet/com.kiwibrowser.browser</a><br>Github:<br><a href="https://github.com/kiwibrowser">https://github.com/kiwibrowser</a><br>Aptoide:<br><a href="https://kiwi-browser-geometry-ou.cn.aptoide.com/app">https://kiwi-browser-geometry-ou.cn.aptoide.com/app</a><br>Github镜像:<br><a href="https://githubcn.hgnet.workers.dev/kiwibrowser/src.next/releases">https://githubcn.hgnet.workers.dev/kiwibrowser/src.next/releases</a></p><p>备注:点击展开Assets ,选择适合的安装包下载<br>一般下载后缀为 -arm64-signed.apk 即可。其他的根据你的设备的架构下载 「架构」-signed.apk</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101030.png"></p><h1 id="开始使用Kiwi浏览器"><a href="#开始使用Kiwi浏览器" class="headerlink" title="开始使用Kiwi浏览器"></a>开始使用Kiwi浏览器</h1><h4 id="3-下载和安装"><a href="#3-下载和安装" class="headerlink" title="3 下载和安装"></a>3 下载和安装</h4><p>①从上面的下载地址下载Kiwi浏览器<br>②点击安装包安装<br>③启动Kiwi浏览器<br>④授予相关权限<br>⑤Enjoy it!</p><h4 id="4-将-Kiwi浏览器-设置为默认浏览器"><a href="#4-将-Kiwi浏览器-设置为默认浏览器" class="headerlink" title="4 将 Kiwi浏览器 设置为默认浏览器"></a>4 将 Kiwi浏览器 设置为默认浏览器</h4><p>如果您将 Kiwi浏览器 设为默认浏览器,那么您点击的任何链接都会自动在 Kiwi浏览器 中打开。</p><ol><li>打开您的默认应用:打开手机的“设置”。在“默认应用”下,点按浏览器应用。<ol><li>依次点按应用管理 默认应用管理 浏览器。</li></ol></li><li>点按 Kiwi Browser</li></ol><p> </p><h4 id="5-导入书签和导出书签"><a href="#5-导入书签和导出书签" class="headerlink" title="5 导入书签和导出书签"></a>5 导入书签和导出书签</h4><p>您可以切换浏览器,同时不会丢失为您喜爱的网站添加的所有书签<br>chrome浏览器书签导出<br>登录下面的链接,可以导出chrome书签文件 <a href="https://takeout.google.com/settings/takeout/custom/chrome?pli=1">https://takeout.google.com/settings/takeout/custom/chrome?pli=1</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229103827.png" alt="image-20211229103827511"></p><p>edge浏览器书签导出</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101037.png"></p><h5 id="①将书签添加到Kiwi浏览器"><a href="#①将书签添加到Kiwi浏览器" class="headerlink" title="①将书签添加到Kiwi浏览器"></a>①将书签添加到Kiwi浏览器</h5><p>请按以下步骤操作:</p><ol><li>在‘@手机上打开 Kiwi浏览器。</li><li>点击右上角的“更多”图标 ┇(3个点点)。</li><li>依次选择书签 导入书签。</li><li>选择包含待导入书签(.html后缀的书签文件)。</li><li>点击导入。</li><li>点击完成。</li></ol><h5 id="②将书签移动到另一个浏览器"><a href="#②将书签移动到另一个浏览器" class="headerlink" title="②将书签移动到另一个浏览器"></a>②将书签移动到另一个浏览器</h5><p>如果您决定使用其他浏览器,则可以导出自己的所有 Kiwi浏览器 书签。</p><ol><li>在手机上打开Kiwi浏览器。</li><li>点击右上角的“更多”图标 。</li><li>选择书签</li><li>点击顶部的“更多”图标 导出书签。</li></ol><p>Kiwi浏览器 会将您的书签导出为 HTML 文件。您可以使用此文件将书签导入另一个浏览器。</p><h1 id="浏览网页"><a href="#浏览网页" class="headerlink" title="浏览网页"></a>浏览网页</h1><h4 id="1-在Kiwi浏览器中使用标签页"><a href="#1-在Kiwi浏览器中使用标签页" class="headerlink" title="1.在Kiwi浏览器中使用标签页"></a>1.在Kiwi浏览器中使用标签页</h4><p>您不仅可在 Kiwi浏览器 中打开任意多个标签页,还可查看所有标签页并在它们之间自如切换。</p><h5 id="打开新的标签页"><a href="#打开新的标签页" class="headerlink" title="打开新的标签页"></a>打开新的标签页</h5><p> 1 在 Android 手机上,打开 Kiwi浏览器 。</p><p> 2 依次点按右上角的“更多”图标 打开新的标签页。</p><h5 id="自定义您的新标签页"><a href="#自定义您的新标签页" class="headerlink" title="自定义您的新标签页"></a>自定义您的新标签页</h5><p>在地址栏中向上滑动手指或打开新标签页后,您会看到自己经常访问的网站。如果您以前没有使用过 Kiwi浏览器,则会看到一些热门网站。</p><ul><li><p>要访问某个网站,请点按相应图标。</p></li><li><p>要移除某个网站,请轻触并按住相应图标,然后点按移除。</p></li></ul><p><strong>用网站地址作为您的标签页</strong></p><p>**1.**在 Android 手机上,打开kiwi浏览器 。</p><p>2.点按右上角的“更多”图标 ,选择“设置”</p><ol><li>然后选择“主页”并启用</li><li>选择“打开此网页”,填入你想要的网站</li></ol><p>5.点击“保存”即可</p><h4 id="2-设置默认搜索引擎"><a href="#2-设置默认搜索引擎" class="headerlink" title="2.设置默认搜索引擎"></a>2.设置默认搜索引擎</h4><p>如果您决定使用其他搜索引擎:</p><ol><li>在手机上打开Kiwi浏览器。</li><li>点击右上角的“更多”图标 。</li><li>点击“设置-搜索引擎”</li><li>选择你想要的搜索引擎</li></ol><h5 id="①问题:-如何添加搜索引擎?"><a href="#①问题:-如何添加搜索引擎?" class="headerlink" title="①问题: 如何添加搜索引擎?"></a>①问题: 如何添加搜索引擎?</h5><p><strong>方法1</strong>:先在你想添加的搜索引擎上随便搜索点东西,然后再到搜索引擎里面去康康有没有这个搜索引擎(如果没有可以多搜索几次,试试~)<br><strong>方法2</strong>:在地址栏输入“chrome://settings ” 自行修改即可</p><p>这里以添加“百度”搜索为例:</p><ol><li>在地址栏输入“chrome://settings” <img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101046.png"></li><li>找到“搜索引擎-管理搜索引擎”<img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101053.png"></li><li>找到“其他搜索引擎-添加”<img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101121.png"></li><li>按如图所示的栗子填写 %s就是关键字 比如https://<a href="user_cancel">www.baidu.com/s?word=</a>%s<img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101059.png"></li></ol><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101104.png"></p><ol><li>设置完毕后,点击“设为默认搜索引擎”</li><li>测试能否搜索</li></ol><h5 id="②分享一些自定义搜索引擎:"><a href="#②分享一些自定义搜索引擎:" class="headerlink" title="②分享一些自定义搜索引擎:"></a>②分享一些自定义搜索引擎:</h5><p>神马AI引擎<br> <a href="https://quark.sm.cn/s?q=">https://quark.sm.cn/s?q=</a><br>Duck Duck Go<br> <a href="https://duckduckgo.com/?q=%25@">https://duckduckgo.com/?q=%@</a><br>百度简单搜索<br> <a href="http://m.baidu.com/s?wd=">http://m.baidu.com/s?wd=</a><br> 秘迹搜索<br> <a href="https://m.mijisou.com/?q=">https://m.mijisou.com/?q=</a><br> 雅虎搜索<br> <a href="https://search.yahoo.com/search?p=">https://search.yahoo.com/search?p=</a><br>谷歌搜索<br> <a href="https://www.google.com/search?q=">https://www.google.com/search?q=</a><br>百度搜索<br> https://<a href="user_cancel">www.baidu.com/s?word=</a><br> 搜狗搜索<br> <a href="https://wap.sogou.com/web/sl?keyword=">https://wap.sogou.com/web/sl?keyword=</a><br>神马搜索<br><a href="http://m.yz.sm.cn/s?q=">http://m.yz.sm.cn/s?q=</a><br>必应搜索<br> <a href="https://www.bing.com/search?q=">https://www.bing.com/search?q=</a><br>Yandex搜索<br> <a href="https://www.yandex.ru/yandsearch?text=">https://www.yandex.ru/yandsearch?text=</a><br> Never搜索<br><a href="user_cancel">https://search.naver.com/search.naver?query=</a><br>F搜<br><a href="https://fsofso.com/search?q=">https://fsofso.com/search?q=</a><br>如果你还有其他好用的搜索引擎,可以补充一下!</p><h4 id="3-下载文件"><a href="#3-下载文件" class="headerlink" title="3.下载文件"></a>3.下载文件</h4><p>要将文件/图片保存到设备上,您可以进行下载。下载的文件将保存到您的默认下载位置。</p><ol><li>在 Android 手机上,打开 Kiwi浏览器。</li><li>转到您想从中下载文件的网页。</li><li>触摸并按住您想下载的内容,然后点按“下载”链接或“下载”图片。在某些视频和音频文件上,则应点按“下载”图标 。</li></ol><h5 id="暂停或取消下载"><a href="#暂停或取消下载" class="headerlink" title="暂停或取消下载"></a>暂停或取消下载</h5><ol><li>在 Android 手机上,打开 Kiwi浏览器。</li><li>在右上角,依次点按“更多”然后点击“下载内容”。如果您的地址栏在底部,请在地址栏上向上滑动手指,然后点按“下载内容”。</li><li>在正在下载的文件旁边,点按“暂停”图标 或“取消”图标</li></ol><p> </p><h5 id="添加第三方下载器"><a href="#添加第三方下载器" class="headerlink" title="添加第三方下载器"></a>添加第三方下载器</h5><p>1.在 Android 手机上,打开 Kiwi浏览器。<br>2.在右上角,依次点按“更多”然后点击“下载内容”。如果您的地址栏在底部,请在地址栏上向上滑动手指,然后点按“下载内容”。</p><ol><li>点击“外部下载器”,选择你的第三方下载软件</li></ol><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101115.png"></p><h4 id="4-日后离线阅读网页"><a href="#4-日后离线阅读网页" class="headerlink" title="4.日后离线阅读网页"></a>4.日后离线阅读网页</h4><p>您可将网页保存下来以供日后阅读,即使是在离线状态下也可照读不误,例如在飞机上或在其他没有网络连接的地方。要想在日后离线阅读网页,请提前在 Kiwi浏览器中予以下载。</p><h5 id="从-Chrome-中保存网页以供日后阅读"><a href="#从-Chrome-中保存网页以供日后阅读" class="headerlink" title="从 Chrome 中保存网页以供日后阅读"></a>从 Chrome 中保存网页以供日后阅读</h5><p>您需要联网才能保存网页。<br>在 Android 手机上,打开 Kiwi浏览器 。<br>转到您要保存的网页。<br>在地址栏的右侧,依次点按“更多”图标 “下载”图标 。</p><h5 id="阅读、删除或分享已保存的网页"><a href="#阅读、删除或分享已保存的网页" class="headerlink" title="阅读、删除或分享已保存的网页"></a>阅读、删除或分享已保存的网页</h5><p>在 Android 手机上,打开 Kiwi浏览器 。<br>在右上角,依次点按“更多”图标 下载内容。如果您的地址栏在底部,请在地址栏上向上滑动手指,然后点按“下载内容”图标 。<br>从您的下载内容列表中找到已保存的网页。阅读:点按相应网页。<br>删除:触摸并按住相应网页。点按右上角的“删除”图标 。<br>分享:触摸并按住相应网页。点按右上角的“分享”图标 。<br>重新联网后,您可通过点按“重新加载”图标 来查看该网页的实时版本。</p><h4 id="5-在夜间模式下浏览"><a href="#5-在夜间模式下浏览" class="headerlink" title="5.在夜间模式下浏览"></a>5.在夜间模式下浏览</h4><p>当您在 Kiwi浏览器 中使用夜间模式浏览内容时,您的主页、工具栏、设置以及某些其他页面都会以深色调显示。</p><ol><li>在 Android 设备上,打开 Kiwi浏览器。</li><li>在右上角,依次点按“更多”-设置 -主题背景。</li><li>选择您想使用的主题背景:如果您想让 Chrome 在省电模式处于开启状态时或在您的移动设备已开启“深色主题”这项设备设置时使用“深色主题”模式,请选择系统默认设置。<ol><li>如果您想让 Chrome 使用“深色主题”模式,请选择深色调。</li><li>如果您想让 Chrome 使用“浅色主题”模式,请选择浅色调。</li></ol></li></ol><p>也可以在“更多”那里直接点击“打开夜间模式”</p><h4 id="6-安装拓展"><a href="#6-安装拓展" class="headerlink" title="6.安装拓展"></a>6.安装拓展</h4><p>**方法1:**使用google网上应用店安装<br><a href="https://chrome.google.com/webstore/category/extensions?hl=zh-CN">https://chrome.google.com/webstore/category/extensions?hl=zh-CN</a><br>(需要科学上网!谷歌访问插件<a href="https://huangenet.lanzoui.com/iQD4srsfseh">https://huangenet.lanzoui.com/iQD4srsfseh</a>)<br>**方法2:**本地导入crx或zip插件</p><p>①点击“拓展程序”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101126.jpeg"></p><p>②打开“开发者模式”,点击“+(from .zip/.crx/.user.js)”,然后选择本地的插件包(.crx或.zip后缀的)即可</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101135.jpeg"></p><p>提示:建议使用ES文件浏览器导入<br><strong>方法3:好用的第三方浏览器拓展商店</strong><br><a href="https://chrome.zzzmh.cn/">https://chrome.zzzmh.cn/</a><br><a href="https://www.extfans.com/">https://www.extfans.com</a><br><a href="http://www.centbrowser.cn/extensions.html">http://www.centbrowser.cn/extensions.html</a><br><a href="https://www.crx4chrome.com/">https://www.crx4chrome.com/</a><br><a href="https://www.chajian5.com/">https://www.chajian5.com/</a><br><a href="http://www.crx4.com/">http://.crx4.com/</a><br><a href="https://www.cnplugins.com/">https://www.cnplugins.com/</a><br><a href="https://www.crxsoso.com/">https://www.crxsoso.com/</a><br><a href="https://173app.com/chrome-ext">https://173app.com/chrome-ext</a><br><a href="https://www.gugeapps.net/">https://www.gugeapps.net/</a></p><p><strong>方法4:如何使用Edge浏览器的拓展</strong><br>1.下载插件并安装<br><a href="https://huangenet.lanzoui.com/imHuzsouuob">https://huangenet.lanzoui.com/imHuzsouuob</a><br>安装这个脚本也可以<br><a href="https://greasyfork.org/zh-CN/scripts/430849-%E5%BE%AE%E8%BD%AFcrx%E4%B8%8B%E8%BD%BD%E5%99%A8">https://greasyfork.org/zh-CN/scripts/430849-%E5%BE%AE%E8%BD%AFcrx%E4%B8%8B%E8%BD%BD%E5%99%A8</a><br>2.打开网址<br><a href="https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home">https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home</a><br>3.看视频<br><a href="https://www.bilibili.com/video/BV1YP4y1W7dT">https://www.bilibili.com/video/BV1YP4y1W7dT</a></p><h4 id="7-如何使用油猴脚本?"><a href="#7-如何使用油猴脚本?" class="headerlink" title="7.如何使用油猴脚本?"></a>7.如何使用油猴脚本?</h4><p>安装 Tampermonkey 或者暴力猴插件(<strong>推荐</strong>)<br>然后打开这个网站安装你想要的脚本<br>脚本网站<br><a href="https://greasyfork.org/zh-CN/">https://greasyfork.org/zh-CN/</a><br>成人脚本网站<br><a href="https://sleazyfork.org/zh-CN">Sleazy Fork - 安全、有用的成人用户脚本大全</a></p><h4 id="8-解决KIWI浏览器出现开屏广告问题(来自酷安-杏铃)"><a href="#8-解决KIWI浏览器出现开屏广告问题(来自酷安-杏铃)" class="headerlink" title="8. 解决KIWI浏览器出现开屏广告问题(来自酷安@杏铃)"></a>8. 解决KIWI浏览器出现开屏广告问题(来自酷安@杏铃)</h4><p>是MIUI智能服务(广告服务)的锅<br>去智能服务悬浮开屏广告方法:<br>手机管家→隐私保护→保护隐私→特殊权限设置→显示在其他应用上层→更多→显示系统应用→拉到最后找到智能服务→允许显示在其它应用上层 <strong>关闭</strong><br>顺便把服务的广告通知关掉吧<br>手机管家-网络助手-流量排行-系统应用-智能服务-右上角圆i-通知管理-允许通知关掉<br>由 <a href="user_cancel">@京岚_Star</a> 提供</p><h4 id="9-标签页视图设置(来自酷安-杏铃)"><a href="#9-标签页视图设置(来自酷安-杏铃)" class="headerlink" title="9.标签页视图设置(来自酷安@杏铃)"></a>9.标签页视图设置(来自酷安@杏铃)</h4><p>设置-Tab switcher</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101151.png"></p><h4 id="10-拓展导出(需要root)"><a href="#10-拓展导出(需要root)" class="headerlink" title="10.拓展导出(需要root)"></a>10.拓展导出(需要root)</h4><p>使用mt管理器打开下面的路径<br>/data/data/com.kiwibrowser.browser/app_chrome/Default/Extensions </p><p>找到你要导出的拓展id</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101157.png"></p><p>然后复制拓展的路径,打开 拓展程序-打包拓展程序,输入路径,点击“打包拓展程序”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101203.png"></p><p>经过以上步骤即可在扩展程序ID目录下看到以.crx为后缀的扩展程序和以.pem为后缀的私钥文件,如下所示</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101207.png"></p><h4 id="11-如何截图"><a href="#11-如何截图" class="headerlink" title="11.如何截图"></a>11.如何截图</h4><p>菜单-分享-屏幕截图</p><h4 id="12-如何扫码"><a href="#12-如何扫码" class="headerlink" title="12.如何扫码"></a>12.如何扫码</h4><p>菜单-分享-二维码-扫描</p><h4 id="13-第三方主页拓展不生效"><a href="#13-第三方主页拓展不生效" class="headerlink" title="13.第三方主页拓展不生效"></a>13.第三方主页拓展不生效</h4><p>把主页改成 chrome://newtab</p><h4 id="14-书签同步教程"><a href="#14-书签同步教程" class="headerlink" title="14.书签同步教程"></a>14.书签同步教程</h4><p>①注册一个坚果云账号<br><a href="https://www.jianguoyun.com/">https://www.jianguoyun.com/</a><br>②新建一个文件夹如下图<br><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101212.png"><br>③将bookmarks.xbel文件上传到这个文件夹<br><a href="https://huangenet.lanzoui.com/i8Uowsqjcdi">https://huangenet.lanzoui.com/i8Uowsqjcdi</a><br>(上面是bookmarks.xbel下载地址)<br>④到账户信息-安全选项-第三方应用管理-添加应用,复制应用密码、服务器地址、账户(一会用到)</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101222.png"></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101216.png"></p><p>⑤安装拓展并启用</p><table><thead><tr><th>floccus bookmarks sync</th><th>[<a href="https://chrome.google.com/webstore/detail/floccus-bookmarks-sync/fnaicdffflnofjppbagibeoednhnbjhg]">https://chrome.google.com/webstore/detail/floccus-bookmarks-sync/fnaicdffflnofjppbagibeoednhnbjhg]</a>(</th></tr></thead></table><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101227.png"></p><p>打开拓展,添加账户(选择第二个选项)</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101233.jpeg">输入信息<br>WebDAV URL:<br><a href="https://dav.jianguoyun.com/dav/">https://dav.jianguoyun.com/dav/</a><br>用户名:你的坚果云登录账号<br>密码:(刚刚创建的应用密码)<br>书签路径:floccus/bookmarks.xbel<br>本地文件:直接点击选择文件夹,选择你要同步的书签文件夹即可。<br>加速同步速度:勾选<br>其他默认即可,点击保存</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101238.jpeg"></p><p>重新打开浏览器,点击同步即可</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101244.jpeg"></p><p>当然你也可以设置不同的同步策略、嵌套帐户什么的<br><strong>注意:为了以防万一,建议本地导出一份备份!!!</strong></p><h4 id="15-设置为默认浏览器(以OPPO为例)"><a href="#15-设置为默认浏览器(以OPPO为例)" class="headerlink" title="15.设置为默认浏览器(以OPPO为例)"></a>15.设置为默认浏览器(以OPPO为例)</h4><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101900.jpeg"></p><h1 id="拓展推荐"><a href="#拓展推荐" class="headerlink" title="拓展推荐"></a><strong>拓展推荐</strong></h1><table><thead><tr><th>序号</th><th>拓展名称</th><th>下载地址</th><th>备注</th></tr></thead><tbody><tr><td>0</td><td>Tampermonkey</td><td><a href="https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo">Tampermonkey - Chrome 网上应用店 (google.com)</a></td><td>Tampermonkey 是第一个可以用来让 Chrome 支持更多 UserScript 的 Chrome 扩展,它可以加入更多的 Chrome 本身不支持的用户脚本功能</td></tr><tr><td>1</td><td>暴力猴</td><td><a href="https://chrome.google.com/webstore/detail/violentmonkey/jinjaccalgkegednnccohejagnlnfdag">https://chrome.google.com/webstore/detail/violentmonkey/jinjaccalgkegednnccohejagnlnfdag</a></td><td>一个开源的用户脚本管理器,支持很多浏览器,Kiwi浏览器建议使用暴力猴</td></tr><tr><td>2</td><td>彩云小译</td><td>插件:<a href="https://chrome.google.com/webstore/detail/lingocloud-web-translatio/jmpepeebcbihafjjadogphmbgiffiajh%E6%B2%B9%E7%8C%B4%E8%84%9A%E6%9C%AC%EF%BC%9Ahttps://wwi.lanzoui.com/i9yBCs5bxhe">https://chrome.google.com/webstore/detail/lingocloud-web-translatio/jmpepeebcbihafjjadogphmbgiffiajh油猴脚本:https://wwi.lanzoui.com/i9yBCs5bxhe</a></td><td>这款翻译插件是真的不错,建议人手一份。因为有翻译次数的限制,所以这里推荐它的油猴脚本</td></tr><tr><td>3</td><td>Adblock Plus</td><td><a href="https://chrome.google.com/webstore/detail/adblock-plus-free-ad-bloc/cfhdojbkjhnklbpkdaibdccddilifddb">https://chrome.google.com/webstore/detail/adblock-plus-free-ad-bloc/cfhdojbkjhnklbpkdaibdccddilifddb</a></td><td>去广告</td></tr><tr><td>4</td><td>AdGuard</td><td><a href="https://chrome.google.com/webstore/detail/adguard-adblocker/bgnkhhnnamicmpeenaelnjfhikgbkllg">https://chrome.google.com/webstore/detail/adguard-adblocke</a>4.0嘻AoshXsyyPLV哈 <a href="https://m.tb.cn/h.fVe4Ilm?sm=c8183c">https://m.tb.cn/h.fVe4Ilm?sm=c8183c</a> 【3期免息】TheONE智能钢琴尊享版88键重锤烤漆电钢琴家用立式<a href="https://chrome.google.com/webstore/detail/adguard-adblocker/bgnkhhnnamicmpeenaelnjfhikgbkllg">r/bgnkhhnnamicmpeenaelnjfhikgbkllg</a></td><td>去广告+1</td></tr><tr><td>5</td><td>uBlock Origin</td><td><a href="https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm">https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm</a></td><td>去广告+3</td></tr><tr><td>6</td><td>igg谷歌访问助手</td><td><a href="https://chrome.google.com/webstore/detail/igg%E8%B0%B7%E6%AD%8C%E8%AE%BF%E9%97%AE%E5%8A%A9%E6%89%8B/ncldcbhpeplkfijdhnoepdgdnmjkckij">https://chrome.google.com/webstore/detail/igg%E8%B0%B7%E6%AD%8C%E8%AE%BF%E9%97%AE%E5%8A%A9%E6%89%8B/ncldcbhpeplkfijdhnoepdgdnmjkckij</a>备用:<a href="https://huangenet.lanzoui.com/iQD4srsfseh">https://huangenet.lanzoui.com/iQD4srsfseh</a></td><td>谷歌访问插件,需要登录</td></tr><tr><td>7</td><td>集装</td><td><a href="https://chrome.google.com/webstore/detail/%E9%9B%86%E8%A3%85%E7%AE%B1/kbgigmcnifmaklccibmlepmahpfdhjch">https://chrome.google.com/webstore/detail/%E9%9B%86%E8%A3%85%E7%AE%B1/kbgigmcnifmaklccibmlepmahpfdhjch</a></td><td>一个插件,提供一揽子服务。</td></tr><tr><td>8</td><td>floccus bookmarks sync</td><td><a href="https://chrome.google.com/webstore/detail/floccus-bookmarks-sync/fnaicdffflnofjppbagibeoednhnbjhg">https://chrome.google.com/webstore/detail/floccus-bookmarks-sync/fnaicdffflnofjppbagibeoednhnbjhg</a></td><td>解决书签同步问题,有一点点的复杂</td></tr><tr><td>9</td><td>lnfinity 新标签页(Pro)</td><td><a href="https://chrome.google.com/webstore/detail/infinity-new-tab-pro/nnnkddnnlpamobajfibfdgfnbcnkgngh">https://chrome.google.com/webstore/detail/infinity-new-tab-pro/nnnkddnnlpamobajfibfdgfnbcnkgngh</a></td><td>人们用的比较多的主页,感觉兼容性不是太好</td></tr><tr><td>10</td><td>MONKNOW 新标签页</td><td><a href="https://chrome.google.com/webstore/detail/monknow-new-tab-personal/lnbjajkbekhkgablenknhapphbdbldeh">https://chrome.google.com/webstore/detail/monknow-new-tab-personal/lnbjajkbekhkgablenknhapphbdbldeh</a></td><td>登陆后支持数据云同步,以及黑暗深色夜间主题模式,比较完美的主页拓展</td></tr><tr><td>11</td><td>User-Agent Switcher and Manager</td><td><a href="https://chrome.google.com/webstore/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg">https://chrome.google.com/webstore/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg</a></td><td>浏览器UA切换,可以弄一些骚操作</td></tr><tr><td>12</td><td>Dark Reader</td><td><a href="https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh">https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh</a></td><td>适用于任何网站的黑暗主题。关爱眼睛,就使用 Dark Reader 进行日常浏览。</td></tr><tr><td>13</td><td>SingleFile</td><td><a href="https://chrome.google.com/webstore/detail/singlefile/mpiodijhokgodhhofbcjdecpffjipkle">https://chrome.google.com/webstore/detail/singlefile/mpiodijhokgodhhofbcjdecpffjipkle</a></td><td>将一个完整的页面保存到单个 HTML 文件中</td></tr><tr><td>14</td><td>猫抓</td><td><a href="https://chrome.zzzmh.cn/info?token=jfedfbgedapdagkghmgibemcoggfppbb">https://chrome.zzzmh.cn/info?token=jfedfbgedapdagkghmgibemcoggfppbb</a></td><td>视频下载神器,不知道为什么谷歌商店没有了</td></tr><tr><td>15</td><td>bilibili下载助手</td><td><a href="https://chrome.zzzmh.cn/info?token=bfcbfobhcjbkilcbehlnlchiinokiijp">https://chrome.zzzmh.cn/info?token=bfcbfobhcjbkilcbehlnlchiinokiijp</a></td><td>停止更新了貌似</td></tr><tr><td>16</td><td>Evernote Web Clipper</td><td><a href="https://chrome.google.com/webstore/detail/evernote-web-clipper/pioclpoplcdbaefihamjohnefbikjilc">https://chrome.google.com/webstore/detail/evernote-web-clipper/pioclpoplcdbaefihamjohnefbikjilc</a></td><td>印象笔记网页保存工具</td></tr><tr><td>17</td><td>二箱</td><td><a href="https://chrome.google.com/webstore/detail/noobox/kidibbfcblfbbafhnlanccjjdehoahep">https://chrome.google.com/webstore/detail/noobox/kidibbfcblfbbafhnlanccjjdehoahep</a></td><td>多引擎以图搜图</td></tr><tr><td>18</td><td>youtube-video-downloader</td><td><a href="https://addoncrop.com/youtube_video_downloader/">https://addoncrop.com/youtube_video_downloader/</a></td><td>油管下载神器</td></tr><tr><td>19</td><td>FeHelper(前端助手)</td><td><a href="https://chrome.google.com/webstore/detail/fehelper%E5%89%8D%E7%AB%AF%E5%8A%A9%E6%89%8B/pkgccpejnmalmdinmhkkfafefagiiiad">https://chrome.google.com/webstore/detail/fehelper%E5%89%8D%E7%AB%AF%E5%8A%A9%E6%89%8B/pkgccpejnmalmdinmhkkfafefagiiiad</a></td><td>JSON自动格式化、手动格式化,支持排序、解码、下载等</td></tr><tr><td>20</td><td>Awesome View Source Button</td><td><a href="https://chrome.google.com/webstore/detail/awesome-view-source-butto/hofjicknmidhbhmflllmmdaihmmggphg">https://chrome.google.com/webstore/detail/awesome-view-source-butto/hofjicknmidhbhmflllmmdaihmmggphg</a></td><td>一键查看网页源码</td></tr><tr><td>21</td><td>Stylish</td><td><a href="https://chrome.google.com/webstore/detail/stylish-custom-themes-for/fjnbnpbmkenffdnngjfgmeleoegfcffe">https://chrome.google.com/webstore/detail/stylish-custom-themes-for/fjnbnpbmkenffdnngjfgmeleoegfcffe</a></td><td>为任意网站自定义主题</td></tr><tr><td>22</td><td>书签侧边栏</td><td><a href="https://chrome.google.com/webstore/detail/bookmark-sidebar/jdbnofccmhefkmjbkkdkfiicjkgofkdh">https://chrome.google.com/webstore/detail/bookmark-sidebar/jdbnofccmhefkmjbkkdkfiicjkgofkdh</a></td><td>支持在任意网站打开你的书签</td></tr><tr><td>23</td><td>Fatkun图片批量下载</td><td><a href="https://chrome.google.com/webstore/detail/fatkun-batch-download-ima/nnjjahlikiabnchcpehcpkdeckfgnohf">https://chrome.google.com/webstore/detail/fatkun-batch-download-ima/nnjjahlikiabnchcpehcpkdeckfgnohf</a></td><td>扒小姐姐照片</td></tr><tr><td>24</td><td>Video Speed Manager</td><td><a href="https://chrome.google.com/webstore/detail/video-speed-manager/fkopaaikpmfhpmoobnmklgmcgmhgfkcd">https://chrome.google.com/webstore/detail/video-speed-manager/fkopaaikpmfhpmoobnmklgmcgmhgfkcd</a></td><td>用来控制视频速度,一点程度上弥补了Chromium系播放视频的不足。</td></tr><tr><td>25</td><td>即刻图床</td><td><a href="https://chrome.google.com/webstore/detail/%E5%8D%B3%E5%88%BB%E5%9B%BE%E5%BA%8A/dckaeinoeaogebmhijpkpmacifmpgmcb">https://chrome.google.com/webstore/detail/%E5%8D%B3%E5%88%BB%E5%9B%BE%E5%BA%8A/dckaeinoeaogebmhijpkpmacifmpgmcb</a></td><td>利用各大厂图床,采用CDN加速</td></tr><tr><td>26</td><td>草料二维码</td><td><a href="https://chrome.google.com/webstore/detail/%E8%8D%89%E6%96%99%E4%BA%8C%E7%BB%B4%E7%A0%81-%E5%BF%AB%E9%80%9F%E7%94%9F%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81%E5%B7%A5%E5%85%B7/moombeodfomdpjnpocobemoiaemednkg">https://chrome.google.com/webstore/detail/%E8%8D%89%E6%96%99%E4%BA%8C%E7%BB%B4%E7%A0%81-%E5%BF%AB%E9%80%9F%E7%94%9F%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81%E5%B7%A5%E5%85%B7/moombeodfomdpjnpocobemoiaemednkg</a></td><td>草料二维码官方开发的免费工具插件,提供简单、专业、快捷的二维码生成和解码功能。</td></tr><tr><td>27</td><td>User-Agent Switcher for Chrome</td><td><a href="https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg">User-Agent Switcher for Chrome - Chrome 网上应用店 (google.com)</a></td><td>浏览器UA切换+1</td></tr><tr><td>28</td><td>Header Editor</td><td><a href="https://chrome.google.com/webstore/detail/header-editor/eningockdidmgiojffjmkdblpjocbhgh">https://chrome.google.com/webstore/detail/header-editor/eningockdidmgiojffjmkdblpjocbhgh</a></td><td>管理浏览器请求,包括修改请求头和响应头、重定向请求、取消请求</td></tr><tr><td>29</td><td>Touch</td><td><a href="https://chrome.google.com/webstore/detail/touch-vpn-secure-and-unli/bihmplhobchoageeokmgbdihknkjbknd">https://chrome.google.com/webstore/detail/touch-vpn-secure-and-unli/bihmplhobchoageeokmgbdihknkjbknd</a></td><td>魔法上网</td></tr><tr><td>30</td><td>ZenMate</td><td><a href="https://chrome.google.com/webstore/detail/zenmate-free-vpn%E2%80%93best-vpn/fdcgdnkidjaadafnichfpabhfomcebme">https://chrome.google.com/webstore/detail/zenmate-free-vpn%E2%80%93best-vpn/fdcgdnkidjaadafnichfpabhfomcebme</a></td><td>魔法上网+1</td></tr><tr><td>31</td><td>守候购物小助手</td><td><a href="https://chrome.google.com/webstore/detail/%E5%AE%88%E5%80%99%E8%B4%AD%E7%89%A9%E5%B0%8F%E5%8A%A9%E6%89%8B/eafefjbddnbamfophdiiiemfkfocaahm">https://chrome.google.com/webstore/detail/%E5%AE%88%E5%80%99%E8%B4%AD%E7%89%A9%E5%B0%8F%E5%8A%A9%E6%89%8B/eafefjbddnbamfophdiiiemfkfocaahm</a></td><td>支持全网价格查询,以及链接快速跳转,购物党必备。</td></tr><tr><td>32</td><td>搜图助手</td><td><a href="https://chrome.google.com/webstore/detail/image-search-assistant/kldhhobmmejaeaiilomaibhjlcfpceac">https://chrome.google.com/webstore/detail/image-search-assistant/kldhhobmmejaeaiilomaibhjlcfpceac</a></td><td>支持多引擎以图搜图以及商品查询(请自备环境)</td></tr><tr><td>33</td><td>类似的网站</td><td><a href="https://chrome.google.com/webstore/detail/similar-sites-discover-re/necpbmbhhdiplmfhmjicabdeighkndkn">https://chrome.google.com/webstore/detail/similar-sites-discover-re/necpbmbhhdiplmfhmjicabdeighkndkn</a></td><td>能够一键找出相似网站,查找资源必备</td></tr><tr><td>34</td><td>Speedtest</td><td><a href="https://chrome.google.com/webstore/detail/speedtest-by-ookla/pgjjikdiikihdfpoppgaidccahalehjh">https://chrome.google.com/webstore/detail/speedtest-by-ookla/pgjjikdiikihdfpoppgaidccahalehjh</a></td><td>测网速</td></tr><tr><td>35</td><td>Circle 网页阅读助手</td><td><a href="https://chrome.google.com/webstore/detail/circle-reader/dhpfcgilccfkodnhbllpiaabofjbjcbg">https://chrome.google.com/webstore/detail/circle-reader/dhpfcgilccfkodnhbllpiaabofjbjcbg</a></td><td>让网页赏心悦目、让阅读回归初心。Circle 阅读助手提供更隐私、更轻松、更舒适的阅读体验</td></tr><tr><td>36</td><td>Octotree</td><td><a href="https://chrome.google.com/webstore/detail/octotree-github-code-tree/bkhaagjahfmjljalopjnoealnfndnagc">https://chrome.google.com/webstore/detail/octotree-github-code-tree/bkhaagjahfmjljalopjnoealnfndnagc</a></td><td>github树状图分布,读代码必备</td></tr><tr><td>37</td><td>RSS Feed Reader</td><td><a href="https://chrome.google.com/webstore/detail/rss-feed-reader/pnjaodmkngahhkoihejjehlcdlnohgmp">https://chrome.google.com/webstore/detail/rss-feed-reader/pnjaodmkngahhkoihejjehlcdlnohgmp</a></td><td>使你的浏览器支持RSS订阅</td></tr><tr><td>38</td><td>Bitwarden</td><td><a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb">https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb</a></td><td>支持密码云同步以及自动网页填充</td></tr><tr><td>39</td><td>Steam Database</td><td><a href="https://chrome.google.com/webstore/detail/steam-database/kdbmhfkmnlmbkgbabkdealhhbfhlmmon">https://chrome.google.com/webstore/detail/steam-database/kdbmhfkmnlmbkgbabkdealhhbfhlmmon</a></td><td>Steam游戏数据,比价</td></tr><tr><td>40</td><td>EditThisCookie</td><td><a href="https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg">https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg</a></td><td>是一个cookie管理器。您可以添加,删除,编辑,搜索,锁定和屏蔽cookies!</td></tr><tr><td>41</td><td>Chrome清理大师</td><td><a href="https://chrome.google.com/webstore/detail/clean-master-the-best-chr/eagiakjmjnblliacokhcalebgnhellfi">https://chrome.google.com/webstore/detail/clean-master-the-best-chr/eagiakjmjnblliacokhcalebgnhellfi</a></td><td>一键清理您的浏览器缓存和垃圾,保护您的隐私,并使您的浏览器更快,更高效只需一次点击,使您的浏览器超快!</td></tr><tr><td>42</td><td>itab</td><td><a href="https://chrome.google.com/webstore/detail/itab-%E6%96%B0%E6%A0%87%E7%AD%BE%E9%A1%B5/mhloojimgilafopcmlcikiidgbbnelip">https://chrome.google.com/webstore/detail/itab-%E6%96%B0%E6%A0%87%E7%AD%BE%E9%A1%B5/mhloojimgilafopcmlcikiidgbbnelip</a></td><td>iTab 组件式图标自定义您的浏览器的标签页,精美日历、炫酷天气、每日头条、海量壁纸、常用网址随心订制</td></tr></tbody></table><p>部分内容来自酷安@byjoke</p><h1 id="脚本推荐"><a href="#脚本推荐" class="headerlink" title="脚本推荐"></a>脚本推荐</h1><p>1.<a href="https://github.com/the1812/Bilibili-Evolved">Bilibili Evolved</a><br>强大的哔哩哔哩增强脚本:下载视频,音乐,封面,弹幕 / 简化直播间,评论区,首页 / 自定义顶栏,删除广告,夜间模式 / 触屏设备支持。<br>2.<a href="https://greasyfork.org/zh-CN/scripts/33005">Direct download from Google Play</a><br>在网页版 Google play 应用信息页面显示多个第三方商店下载按钮。<br>3.<a href="https://greasyfork.org/zh-CN/scripts/397363">Youtube 双语字幕</a><br>如果不能自动加载,请关闭字幕再次打开即可。<br>4.<a href="https://greasyfork.org/zh-CN/scripts/6303">iciba 划词翻译</a><br>划词出现多个词典结果。</p><p>5. <a href="https://greasyfork.org/zh-CN/scripts/383143">收藏夹 Fix</a><br> 显示 B 站收藏夹中失效视频的 av 号、简介、标题、封面,给个补救(替代)机会。<br>6. <a href="https://greasyfork.org/zh-CN/scripts/38899">回到顶部 / 底部</a><br> 页面右侧中部显示回到顶部 / 底部按钮。<br>7. <a href="https://greasyfork.org/zh-CN/scripts/37988">拒绝二维码登录</a><br> 可自定义设置在指定网站开启和关闭。<br>8. <a href="https://greasyfork.org/zh-CN/scripts/14146">网页限制解除</a><br> 通杀大部分网站,可以解除禁止复制、剪切、选择文本、右键菜单的限制。<br>9. <a href="https://greasyfork.org/zh-CN/scripts/25718">解除 B 站区域限制</a><br> 通过替换获取视频地址接口的方式,实现解除 B 站区域限制。<br>10. <a href="https://greasyfork.org/zh-CN/scripts/40303">购物党比价工具【精简版】</a><br> 提供各个电商平台价格历史比较、口碑评分等查询。<br> 11.<a href="https://greasyfork.org/zh-CN/scripts/24204">Picviewer CE+</a><br> 网页在线看图增强,支持图片旋转、缩放、多张悬浮、批量保存等。<br> 12.<a href="https://greasyfork.org/zh-CN/scripts/27752">searchEngineJump</a><br> 在各个搜索引擎搜索结果下提供其他搜索引擎,提供可视化设置菜单。<br>11. <a href="https://greasyfork.org/zh-CN/scripts/22590">一键离线下载</a><br> 一键自动将磁链、bt 种子或其他下载资源离线下载至网盘<br> 14.<a href="https://greasyfork.org/zh-CN/scripts/2998">Search By Image</a><br> 多引擎以图搜图,按住 Ctrl 键并在网页图片上右键调出搜索引擎,可自定义快捷键和其他搜图引擎。<br> 15.<a href="https://greasyfork.org/zh-CN/scripts/24508">Userscript+</a><br> 为当前网页查找油猴脚本。<br> 16.<a href="https://userstyles.org/styles/173673/pure">Pure 百度</a><br> 美化百度各个常使用的网页样式。若在百度搜索结果页与 AC-baidu 发生冲突,可编辑 pure 的代码删除百度主域名即可。<br> 17.<a href="https://greasyfork.org/zh-CN/scripts/14178">AC-baidu</a><br> 主要美化百度首页及搜索结果页样式,重定向优化百度搜狗谷歌搜索,添加标记数量。<br>12. <a href="https://greasyfork.org/zh-CN/scripts/368418">关键词自动高亮</a><br> 自动提取搜索页面的搜索关键词,对关键词自动进行高亮处理。<br>13. <a href="https://github.com/ChirmyRam/SmoothScroll">质感字体 && 页面平滑滚动</a><br> 让字体变得有质感,页面滚动平滑,字体换为萍方字体并添加字体阴影。<br> 20.<a href="https://greasyfork.org/zh-CN/scripts/372516">bilibili merged</a><br> B 站播放器右键增强,FLV 下载合并,原生 MP4、弹幕、CC 字幕转码等。bilibili merged<br>14. <a href="https://www.baiduyun.wiki/tool/install-darkmode.html">夜间模式助手</a><br> 使用脚本实现夜间模式,保护眼睛。<br> 22.<a href="https://userstyles.org/styles/170654/bilibili-2019">bilibili 彩虹猫进度条</a><br> 将 B 站进度条变为绚丽的彩虹猫。<br>15. <a href="https://greasyfork.org/zh-CN/scripts/29762">网盘自动填写访问码【威力加强版】</a><br> 打开百度网盘分享链接时自动填入分享吗并打开<br> (参考<a href="https://www.chirmyram.top/archives/scripts">https://www.chirmyram.top/archives/scripts</a>)</p><h1 id="其他内容"><a href="#其他内容" class="headerlink" title="其他内容"></a>其他内容</h1><h4 id="8-彩蛋小游戏"><a href="#8-彩蛋小游戏" class="headerlink" title="8 彩蛋小游戏"></a>8 彩蛋小游戏</h4><p>地址栏输入 chrome://dino 就可以愉快地玩耍了</p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101259.jpeg" style="zoom: 33%;" /><h4 id="2-欧朋浏览器的插件,kiwi浏览器也可以使用"><a href="#2-欧朋浏览器的插件,kiwi浏览器也可以使用" class="headerlink" title="2.欧朋浏览器的插件,kiwi浏览器也可以使用"></a>2.欧朋浏览器的插件,kiwi浏览器也可以使用</h4><p><a href="user_cancel">https://addons.opera.com/zh-cn/extensions</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229110437.png" alt="image-20211229110437458"></p><h4 id="3-好看的浏览器主页"><a href="#3-好看的浏览器主页" class="headerlink" title="3.好看的浏览器主页"></a>3.好看的浏览器主页</h4><p><a href="https://liumingye.gitee.io/quarkhomepage/">主页 (gitee.io)</a><br><a href="https://quickso.cn/">https://quickso.cn/</a><br><a href="https://5iux.cn/">https://5iux.cn/</a><br><a href="https://zhuye.xyz/">https://zhuye.xyz/</a><br><a href="https://limestart.cn/">https://limestart.cn/</a><br><a href="https://wht.im/">https://wht.im/</a><br><strong>chrome默认页面</strong><br>chrome://newtab/<br><strong>chrome书签页</strong><br>chrome-native://bookmarks/</p><p><strong>一款MaterialDesign主页</strong><br>来自酷安@zongou<br><a href="https://github.com/zongou/new-tab-zongou">https://github.com/zongou/new-tab-zongou</a></p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101310.jpeg" style="zoom:33%;" /><h4 id="4-Kiwi浏览器相关视频推荐"><a href="#4-Kiwi浏览器相关视频推荐" class="headerlink" title="4.Kiwi浏览器相关视频推荐"></a>4.Kiwi浏览器相关视频推荐</h4><p>1.分享一款安卓端硬核浏览器,并教你如何安装chrome原生扩展!<br><a href="https://www.bilibili.com/video/BV1gJ411D7Rf?from=search&seid=2295528506509480260">https://www.bilibili.com/video/BV1gJ411D7Rf?from=search&seid=2295528506509480260</a><br>2.给你的手机浏览器装上扩展!安卓手机上最强大的浏览器 ── Kiwi浏览器使用教程<br><a href="https://www.bilibili.com/video/BV1Zf4y1D72i?from=search&seid=2295528506509480260">https://www.bilibili.com/video/BV1Zf4y1D72i?from=search&seid=2295528506509480260</a><br>3.Kiwi Browser-一款能装插件的手机chromium内核浏览器,去广告神器<br><a href="https://www.bilibili.com/video/BV1HJ411M72K?from=search&seid=2295528506509480260">https://www.bilibili.com/video/BV1HJ411M72K?from=search&seid=2295528506509480260</a></p><h1 id="关于本手册"><a href="#关于本手册" class="headerlink" title="关于本手册"></a>关于本手册</h1><p>制作人:木子欢儿<br>项目地址:<br><a href="https://github.com/muzihuaner/kiwibrowsercn">https://github.com/muzihuaner/kiwibrowsercn</a><br>QQ:2209514944<br>微信:<br>E-Mail:<a href="[email protected]">[email protected]</a><br>酷安:欢哥科技<br>版本:1.2.1<br>最后更新:2022.07.13<br>编写不易,如果您喜欢这个文档,欢迎赞助我们,您的支持是我们最大的动力!<br><a href="https://huangetech.gitee.io/pay/">https://huangetech.gitee.io/pay/</a><br>微信公众号:</p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20211229101317.png" style="zoom:25%;" />]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Kiwi</tag>
<tag>浏览器</tag>
</tags>
</entry>
<entry>
<title>内网穿透神器ZeroTier使用教程</title>
<link href="/2021/09/22/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E7%A5%9E%E5%99%A8ZeroTier%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/"/>
<url>/2021/09/22/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E7%A5%9E%E5%99%A8ZeroTier%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</url>
<content type="html"><![CDATA[<p>随着可用的公网 IPv4 地址越来越少,现在的运营商基本不给家用宽带分配公网 IP 了。如果你想通过外网访问到内网的资源,目前只能采用内网穿透的软件来实现。而一般常规的内网穿透软件都需要一个公网 IP 才能正常工作,比如:「<a href="https://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247485670&idx=1&sn=df62f2df93f112a7bc0b8d7e843bbc16&chksm=eac529cfddb2a0d9b0fb22324f3eaf5cffeb8e0a56d16efb87ad97d3cca6479e96e12c68eb88&token=211998253&lang=zh_CN#rd">FRP</a>」 或 「<a href="https://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247483754&idx=1&sn=c701d750ea87421446ec2f3202beab33&chksm=eac52043ddb2a955c282f8337d6c0fc63034f3f9e378ae1b1fcc0b53be1f20c8b4f55c159c94&token=211998253&lang=zh_CN#rd">Ngork</a>」 等。这样你就不得不租用一个拥有公网 IP 的服务器才能实现上述需求,显然增加了不少使用成本。</p><p>做为一个<code>月薪 3000</code> 的屌丝怎么可能折腾得起呢?今天,我们就来介绍一款不需要公网 IP 实现内网穿透的工具 <code>ZeroTier</code> 。<code>ZeroTier</code> 是一个专门用来建立点对点虚拟专用网(<code>P2P VPN</code>)的工具,它提供在线管理界面和全平台的客户端,不需要复杂设置,只要安装客户端并加入到自己创建的网络即可。</p><blockquote><ol><li>官方网站地址:<a href="https://www.zerotier.com/">https://www.zerotier.com</a></li><li>项目地址:<a href="https://github.com/zerotier">https://github.com/zerotier</a></li></ol></blockquote><h2 id="ZeroTier-原理"><a href="#ZeroTier-原理" class="headerlink" title="ZeroTier 原理"></a>ZeroTier 原理</h2><p><code>ZeroTier</code> 这一类 <code>P2P VPN</code> 是在互联网的基础上将自己的所有设备组成一个私有的网络,可以理解为互联网连接的局域网。最常见的场景就是在公司可以用手机直接访问家里的 <code>NAS</code>,而且是点对点直连,数据传输并不经由第三方服务器中转。</p><p><code>Zerotier</code> 在多设备之间建立了一个 <code>Peer to Peer VPN(P2PVPN)</code> 连接,如:在笔记本电脑、台式机、嵌入式设备、云资源和应用。这些设备只需要通过 <code>ZeroTier One</code> ( ZeroTier 的客户端) 在不同设备之间建立直接连接,即使它们位于 <code>NAT</code> 之后。连接到虚拟 <code>LAN</code> 的任何计算机和设备通常通过 <code>NAT</code> 或路由器设备与 <code>Internet</code> 连接,<code>ZeroTier One</code> 使用 <code>STUN</code> 和隧道来建立 <code>NAT</code> 后设备之间的 <code>VPN</code> 直连。</p><p>简单一点说,<code>Zerotier</code> 就是通过 <code>P2P</code> 等方式实现形如交换机或路由器上 <code>LAN</code> 设备的内网互联。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102229.png" alt="img"></p><p><code>ZeroTier</code> 官方搭建了一个行星根服务器叫做 <code>地球 Earth</code>,这个行星根服务器是唯一且是免费的,它记录了所有的路径信息,一般情况下大家都直接用的这个。</p><p>行星根服务器 R 记录了所有的路径信息,设备 A 能通过 <code>ZeroTier</code> 唯一地址标识找到需要连接的设备 B。这个过程如下:</p><ol><li>A 想要将数据包发送到 B,但由于它没有直接路径,因此将其向上发送到 R。</li><li>如果 R 有直接链接到 B,它会转发数据包给 B。否则它会继续向上游发送数据包,直到达到行星根 (planet)。行星根知道所有节点,所以如果 B 在线,最终数据包将到达 B。</li><li>R 还向 A 发送一个消息,包含有关它如何到达 B 的提示。同时,将消息发给 B,通知 B 它如何到达 A。</li><li>A 和 B 获取它们的消息并尝试相互发送测试消息,可能会对 NAT 或状态防火墙进行穿透。如果这样可以建立直接链路,则不再需要中继。</li><li>如果无法建立直接路径,则通信可以继续中继 (速度慢)</li></ol><p>除此之外还有 12 个遍布全球的根服务器,这些是收费的服务。由于 Earth 在国外,如果使用免费套餐,连接时的延迟可能会很高。不过 <code>ZeroTier</code> 能自己创建根服务器 <code>月球 Moons</code>,这样我们就能在大局域网中得到更好的体验了。</p><h2 id="注册与客户端安装"><a href="#注册与客户端安装" class="headerlink" title="注册与客户端安装"></a>注册与客户端安装</h2><h3 id="注册帐号"><a href="#注册帐号" class="headerlink" title="注册帐号"></a>注册帐号</h3><p>登录官网注册即可,填写你的邮箱和密码。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102236.png" alt="img"></p><p>注册之后是这样的,保持默认就好。每个免费套餐可以享受 100 台设备的内网互联,一般够用了。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102244.jpeg" alt="img"></p><h3 id="网络配置"><a href="#网络配置" class="headerlink" title="网络配置"></a>网络配置</h3><p>注册好之后,我们来建立一个 Network 并分配内网网段。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102253.png" alt="img"></p><p>创建一个新的网络之后,我们会得到一个 <code>Network ID</code>。这是客户端连接到行星服务器的唯一识别码,需要牢记。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102301.png" alt="img"></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102308.png" alt="img"></p><h3 id="客户端配置"><a href="#客户端配置" class="headerlink" title="客户端配置"></a>客户端配置</h3><p><code>ZeroTier</code> 支持 <code>Windows</code>、<code>macOS</code>、<code>Linux</code> 三大桌面平台,<code>iOS</code>、<code>Android</code> 两大移动平台,<code>QNAP(威连通)</code>、<code>Synology(群晖)</code>、<code>Western Digital MyCloud NAS(西部数据)</code> 三个 <code>NAS</code> 平台,还支持 <code>OpenWrt/LEDE</code> 开源路由器项目。</p><blockquote><p>下载地址:<a href="https://www.zerotier.com/download/">https://www.zerotier.com/download/</a></p></blockquote><p>这里我们以 <code>iOS</code> 和 <code>Mac</code> 设备为例介绍一下客户端如何与 <code>Planet</code> 相连接并分配到内网地址。</p><p><code>iOS</code> 下载好 <code>ZeroTier One</code> 之后,填入刚刚的 <code>Network ID</code>,配置好 <code>VPN</code> 后就会启动连接。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102317.png" alt="img"></p><p><code>macOS</code> 使用方法同理,并且可以直接使用命令行进行操作。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102324.png" alt="img"></p><p>直接使用命令行进行操作的方法如下:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta"># </span><span class="language-bash">启动</span><br><span class="hljs-meta">$ </span><span class="language-bash">zerotier-one -d</span><br><span class="hljs-meta"></span><br><span class="hljs-meta"># </span><span class="language-bash">获取地址和服务状态</span><br><span class="hljs-meta">$ </span><span class="language-bash">zerotier-cli status</span><br><span class="hljs-meta"></span><br><span class="hljs-meta"># </span><span class="language-bash">加入、离开、列出网络</span><br><span class="hljs-meta">$ </span><span class="language-bash">zerotier-cli <span class="hljs-built_in">join</span> <span class="hljs-comment"># Network ID</span></span><br><span class="hljs-meta">$ </span><span class="language-bash">zerotier-cli leave <span class="hljs-comment"># Network ID</span></span><br><span class="hljs-meta">$ </span><span class="language-bash">zerotier-cli listnetworks</span><br></code></pre></td></tr></table></figure><p>这时会根据 <code>MAC</code> 地址分配给设备一个唯一认证字符串 <code>Node ID</code>,可用来在 <code>Web</code> 配置界面保留该设备不被删除以及帮助我们区分设备。</p><h3 id="认证设备和组网"><a href="#认证设备和组网" class="headerlink" title="认证设备和组网"></a>认证设备和组网</h3><p>回到一开始注册的网页,会发现设备列表当中新增了两台设备,在前面的方框打钩即可。根据 <code>Node ID</code> 判断设备的类型,牢记设备被分配的 <code>IP</code> 。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102332.png" alt="img"></p><h3 id="测试设备间互访"><a href="#测试设备间互访" class="headerlink" title="测试设备间互访"></a>测试设备间互访</h3><p>为了测试不同网络访问:<code>MBP</code> 连接电信网络,<code>iPhone</code> 连接移动 <code>4G</code> 网络。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210922102340.png" alt="img"></p><p>从图中我们可以看到已经成功连接上了 <code>Mac</code> 的 <code>SSH</code>。由于免费的根服务器在国外,可能访问速度不太稳定。</p><blockquote><p>除非你有两台路由器,一台放在家里,另一台放在公司等地,并且有大量设备连接于这两台路由器且需要内网穿透,否则不要在路由器上面部署 <code>ZeroTier</code>,仅使用单设备客户端即可。并且为了连接的稳定性,强烈建议自己部署 <code>Moon</code> 节点。</p></blockquote><h2 id="延伸阅读"><a href="#延伸阅读" class="headerlink" title="延伸阅读"></a>延伸阅读</h2><p>上面的示例中,我们只介绍了 <code>ZeroTier</code> 的基本使用。<code>ZeroTier</code> 的功能远不止这些,如果你非常感兴趣还可以参考下面这些文档:</p><blockquote><ol><li>Openwrt 使用 ZeroTier 实现内网穿透</li></ol><p>链接:<a href="https://qingsay.com/zerotier-openwrt.html">https://qingsay.com/zerotier-openwrt.html</a></p><ol><li>无公网 IP 搞定群晖 + ZEROTIER ONE 实现内网穿透</li></ol><p>链接 1:<a href="https://www.hao4k.cn/thread-29377-1-1.html">https://www.hao4k.cn/thread-29377-1-1.html</a></p><p>链接 2:<a href="https://zhuanlan.zhihu.com/p/73558450">https://zhuanlan.zhihu.com/p/73558450</a></p><ol><li>使用 ZeroTier 建立 IPv6 隧道</li></ol><p>链接:<a href="https://moe.best/tutorial/zerotier-ipv6.html">https://moe.best/tutorial/zerotier-ipv6.html</a></p><ol><li>在容器中不依赖 TUN/TAP 使用 ZeroTier 实现 P2P VPN</li></ol><p>链接:<a href="http://www.senra.me/nat-traversal-series-zerotier-p2p-vpn-can-be-used-in-container-without-tuntap/">http://www.senra.me/nat-traversal-series-zerotier-p2p-vpn-can-be-used-in-container-without-tuntap/</a></p><ol><li>Zerotier 简明教程</li></ol><p>链接:<a href="https://jiajunhuang.com/articles/2019_09_11-zerotier.md.html">https://jiajunhuang.com/articles/2019_09_11-zerotier.md.html</a></p><ol><li>使用 Docker 创建 ZeroTier Moon 节点</li></ol><p>链接:<a href="https://www.cnblogs.com/webenh/p/11263421.html">https://www.cnblogs.com/webenh/p/11263421.html</a></p><ol><li>Zerotier 2.0 的愿景图</li></ol><p>链接:<a href="https://www.zealic.com/2019/10/zerotier2/">https://www.zealic.com/2019/10/zerotier2/</a></p></blockquote><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>从上面的介绍,我们可以看到 <code>ZeroTier</code> 在使用上非常简单、也支持多设备多平台,并且可以无需公网服务器。但由于其免费的根服务器在国外,可能网速会一定影响,建议自建私有根服务器。</p><h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h2><ol><li><a href="https://www.google.com/">https://www.google.com</a></li><li><a href="https://zhih.me/zerotier-getting-started/">https://zhih.me/zerotier-getting-started/</a></li><li><a href="https://www.newlearner.site/2019/07/30/zerotier.html">https://www.newlearner.site/2019/07/30/zerotier.html</a></li></ol>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Linux</tag>
<tag>内网穿透</tag>
<tag>ZeroTier</tag>
</tags>
</entry>
<entry>
<title>利用免费oss对象存储实现域名防红</title>
<link href="/2021/08/27/%E5%88%A9%E7%94%A8%E5%85%8D%E8%B4%B9oss%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E5%AE%9E%E7%8E%B0%E5%9F%9F%E5%90%8D%E9%98%B2%E7%BA%A2/"/>
<url>/2021/08/27/%E5%88%A9%E7%94%A8%E5%85%8D%E8%B4%B9oss%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E5%AE%9E%E7%8E%B0%E5%9F%9F%E5%90%8D%E9%98%B2%E7%BA%A2/</url>
<content type="html"><![CDATA[<p>大家在使用微信分享转发链接的时候,都很容易碰到链接在微信中无法打开网页的问题。通常这种情况微信会给个提示 “已停止访问该网址” ,导致这个情况的因素有以下三点。</p><p>1、分享链接被多人举报。</p><p>2、链接含违规内容,含敏感词。</p><p>3、被腾讯检测系统判断为诱导分享内容。</p><p>被人举报我们无法阻止,因为现在行业竞争大,举报的人里其实用户占很少数,多数都是来自同行的恶意举报,这是没有办法的事。第一种情况我们无法避免,但是我们可以避免链接因含敏感词或者含违规内容从而被腾讯主动拦截。</p><p>这里呢教一个简单的方法做一个域名防红的网页,实现微信跳转链接,也就是微信内置浏览器不能打开网页,需要跳转其他浏览器打开链接</p><h2 id="步骤:"><a href="#步骤:" class="headerlink" title="步骤:"></a>步骤:</h2><p>1.首先找一个免费的OSS桶也就是对象存储,这里以腾讯云为例</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210827222008.png" alt="image-20210827222008739"></p><p>2.新建一个名为“index.html”的文件,写入下面的内容</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag"><<span class="hljs-name">html</span>></span><br><span class="hljs-tag"><<span class="hljs-name">head</span>></span><br><span class="hljs-tag"><<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"utf-8"</span>></span><br><span class="hljs-tag"><<span class="hljs-name">title</span>></span>请用浏览器打开<span class="hljs-tag"></<span class="hljs-name">title</span>></span><br><span class="hljs-tag"><<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover"</span>></span><br><span class="hljs-tag"></<span class="hljs-name">head</span>></span><br><span class="hljs-tag"><<span class="hljs-name">body</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210822121123.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"340"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"600"</span> <span class="hljs-attr">align</span>=<span class="hljs-string">"absmiddle"</span>></span><br> <br><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"tips"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"font-size:25px;text-align: center;line-height: 50px;"</span>></span><span class="hljs-tag"></<span class="hljs-name">div</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript"></span><br><span class="language-javascript"> <span class="hljs-keyword">var</span> url = <span class="hljs-variable language_">document</span>.<span class="hljs-property">location</span>.<span class="hljs-title function_">toString</span>();</span><br><span class="language-javascript"> <span class="hljs-keyword">var</span> urlParmStr = url.<span class="hljs-title function_">slice</span>(url.<span class="hljs-title function_">indexOf</span>(<span class="hljs-string">'='</span>)+<span class="hljs-number">1</span>);</span><br><span class="language-javascript"> <span class="hljs-keyword">if</span> (<span class="hljs-title function_">is_weixn_qq</span>()) {</span><br><span class="language-javascript"> ;</span><br><span class="language-javascript"> <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">"tips"</span>).<span class="hljs-property">innerHTML</span>=<span class="hljs-string">"请在浏览器打开本页面"</span>;</span><br><span class="language-javascript"> </span><br><span class="language-javascript"> }</span><br><span class="language-javascript"><span class="hljs-keyword">else</span>{</span><br><span class="language-javascript"> <span class="hljs-comment">// 不是微信客户端,直接可以访问链接</span></span><br><span class="language-javascript"> location.<span class="hljs-property">href</span>=urlParmStr;</span><br><span class="language-javascript"> }</span><br><span class="language-javascript"> <span class="hljs-comment">// 判断QQUA的代码无需修改</span></span><br><span class="language-javascript"> <span class="hljs-keyword">function</span> <span class="hljs-title function_">is_weixn_qq</span>(<span class="hljs-params"></span>) {</span><br><span class="language-javascript"> <span class="hljs-keyword">var</span> ua = navigator.<span class="hljs-property">userAgent</span>.<span class="hljs-title function_">toLowerCase</span>();</span><br><span class="language-javascript"> <span class="hljs-keyword">if</span> (ua.<span class="hljs-title function_">match</span>(<span class="hljs-regexp">/MicroMessenger/i</span>) == <span class="hljs-string">"micromessenger"</span>) {</span><br><span class="language-javascript"> <span class="hljs-keyword">return</span> <span class="hljs-string">"weixin"</span>;</span><br><span class="language-javascript"> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (ua.<span class="hljs-title function_">match</span>(<span class="hljs-regexp">/QQ/i</span>) == <span class="hljs-string">"qq"</span>) {</span><br><span class="language-javascript"> <span class="hljs-keyword">return</span> <span class="hljs-string">"QQ"</span>;</span><br><span class="language-javascript"> }</span><br><span class="language-javascript"> <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;</span><br><span class="language-javascript"> }</span><br><span class="language-javascript"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"></<span class="hljs-name">body</span>></span><br><span class="hljs-tag"></<span class="hljs-name">html</span>></span><br></code></pre></td></tr></table></figure><p>3.将文件上传到你创建的存储桶,然后复制文件的链接</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210827222419.png" alt="image-20210827222419744"></p><p>4.在你复制的链接后加?url=你的网址</p><p>比如: /index.html?url=<a href="https://www.baidu.com/">https://www.baidu.com</a></p><p>5.然后发送就可以啦!当用QQ或微信打开就会显示这个</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210827222744.jpg"></p><p>6.什么?还是被拦截?那就再创建新的对象存储上传,就是了</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>对象存储</tag>
<tag>oss</tag>
</tags>
</entry>
<entry>
<title>利用cloudflareWorkers创建一个短网址程序</title>
<link href="/2021/08/26/%E5%88%A9%E7%94%A8cloudflareWorkers%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%9F%AD%E7%BD%91%E5%9D%80%E7%A8%8B%E5%BA%8F/"/>
<url>/2021/08/26/%E5%88%A9%E7%94%A8cloudflareWorkers%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%9F%AD%E7%BD%91%E5%9D%80%E7%A8%8B%E5%BA%8F/</url>
<content type="html"><![CDATA[<h3 id="去Workers-KV中创建一个命名空间"><a href="#去Workers-KV中创建一个命名空间" class="headerlink" title="去Workers KV中创建一个命名空间"></a>去Workers KV中创建一个命名空间</h3><p><a href="https://www.nbmao.com/wp-content/uploads/2021/05/20210519204334-73658.png"><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210826104503.png" alt="img"></a></p><h3 id=""><a href="#" class="headerlink" title=""></a></h3><h3 id="去Worker的Settings选选项卡中绑定KV-Namespace"><a href="#去Worker的Settings选选项卡中绑定KV-Namespace" class="headerlink" title="去Worker的Settings选选项卡中绑定KV Namespace"></a>去Worker的Settings选选项卡中绑定KV Namespace</h3><p><a href="https://www.nbmao.com/wp-content/uploads/2021/05/20210519204335-7b3cc.png"><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210826104511.png" alt="img"></a></p><h3 id="其中Variable-name填写LINKS-KV-namespace填写你刚刚创建的命名空间"><a href="#其中Variable-name填写LINKS-KV-namespace填写你刚刚创建的命名空间" class="headerlink" title="其中Variable name填写LINKS, KV namespace填写你刚刚创建的命名空间"></a>其中Variable name填写<code>LINKS</code>, KV namespace填写你刚刚创建的命名空间</h3><p><a href="https://www.nbmao.com/wp-content/uploads/2021/05/20210519204335-408c5.png"><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210826104517.png" alt="img"></a></p><h3 id="复制本项目中的index-js的代码到Cloudflare-Worker"><a href="#复制本项目中的index-js的代码到Cloudflare-Worker" class="headerlink" title="复制本项目中的index.js的代码到Cloudflare Worker"></a>复制本项目中的<code>index.js</code>的代码到Cloudflare Worker</h3><h3 id="点击:Save-and-Deploy"><a href="#点击:Save-and-Deploy" class="headerlink" title="点击:Save and Deploy"></a>点击:Save and Deploy</h3><p> Q:如何24小时后删除地址?</p><p>A:参考<a href="https://developers.cloudflare.com/workers/runtime-apis/kv#creating-expiring-keys">https://developers.cloudflare.com/workers/runtime-apis/kv#creating-expiring-keys</a><br>将原代码</p><p>Url-Shorten-Worker/index.js 中的第36行的</p><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs livecodeserver"><span class="hljs-literal">return</span> await LINKS.<span class="hljs-built_in">put</span>(random_key, <span class="hljs-built_in">URL</span>),random_key <br></code></pre></td></tr></table></figure><p>改为</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">return</span> await LINKS.put(random_key, URL, {expirationTtl: <span class="hljs-number">60</span>*<span class="hljs-number">60</span>*<span class="hljs-number">24</span>}),random_key <br></code></pre></td></tr></table></figure><h2 id="站点演示:https-zhiurl-cn"><a href="#站点演示:https-zhiurl-cn" class="headerlink" title="站点演示:https://zhiurl.cn/"></a>站点演示:<a href="https://zhiurl.cn/">https://zhiurl.cn/</a></h2><h3 id="项目地址:https-github-com-xyTom-Url-Shorten-Worker"><a href="#项目地址:https-github-com-xyTom-Url-Shorten-Worker" class="headerlink" title="项目地址:https://github.com/xyTom/Url-Shorten-Worker"></a>项目地址:<a href="https://github.com/xyTom/Url-Shorten-Worker">https://github.com/xyTom/Url-Shorten-Worker</a></h3>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>CloudFlare</tag>
<tag>短网址</tag>
</tags>
</entry>
<entry>
<title>Github个人首页美化指北</title>
<link href="/2021/08/02/Github%E4%B8%AA%E4%BA%BA%E9%A6%96%E9%A1%B5%E7%BE%8E%E5%8C%96%E6%8C%87%E5%8C%97/"/>
<url>/2021/08/02/Github%E4%B8%AA%E4%BA%BA%E9%A6%96%E9%A1%B5%E7%BE%8E%E5%8C%96%E6%8C%87%E5%8C%97/</url>
<content type="html"><![CDATA[<p>闲逛Github的时候,会发现有的Profile页面出现了一个README的头部,里面可以使用markdown自定义一些信息进行展示。查询了一下发现是Github新出现的一个秘密功能模块。不由分说,赶紧弄起来</p><h3 id="1-新建个人仓库"><a href="#1-新建个人仓库" class="headerlink" title="1.新建个人仓库"></a>1.新建个人仓库</h3><p>要展示这个特殊的模块,就需要新建一个”特殊“的仓库。这个仓库名称与你的Github用户名相同。如果你以Github用户名新建仓库,就会提示一段话:</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210802143541.png" alt="image-20210802143540972"></p><blockquote><p>You found a secret! <strong>muzihuaner/muzihuaner</strong> is a ✨<em>special</em> ✨ repository that you can use to add a <code>README.md</code> to your GitHub profile. Make sure it’s public and initialize it with a <strong>README</strong> to get started.</p></blockquote><p>记得创建仓库的时候初始化一个README.md文件。</p><h3 id="2-编辑README-md文件"><a href="#2-编辑README-md文件" class="headerlink" title="2.编辑README.md文件"></a>2.编辑README.md文件</h3><p>打开README.md文件,就会发现Github已经创建好了一段信息,给你补充的灵感。当然,也可以按照自己的想法进行修改。</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs applescript">- 🔭 I’m currently working <span class="hljs-keyword">on</span> …<br>- 🌱 I’m currently learning …<br>- 👯 I’m looking <span class="hljs-keyword">to</span> collaborate <span class="hljs-keyword">on</span> …<br>- 🤔 I’m looking <span class="hljs-keyword">for</span> help <span class="hljs-keyword">with</span> …<br>- 💬 Ask <span class="hljs-keyword">me</span> <span class="hljs-keyword">about</span> …<br>- 📫 How <span class="hljs-keyword">to</span> reach <span class="hljs-keyword">me</span>: …<br>- 😄 Pronouns: …<br>- ⚡ Fun fact: …<br></code></pre></td></tr></table></figure><p>编辑好文件打开个人首页就可以看到效果了。</p><h3 id="3-展示控件"><a href="#3-展示控件" class="headerlink" title="3.展示控件"></a>3.展示控件</h3><p>下面介绍几个不错的展示组件和灵感来源。</p><h4 id="3-1动态GitHub-Readme-Stats"><a href="#3-1动态GitHub-Readme-Stats" class="headerlink" title="3.1动态GitHub Readme Stats"></a>3.1动态GitHub Readme Stats</h4><p><a href="https://github.com/anuraghazra/github-readme-stats">anuraghazra/github-readme-stats</a>提供了一个展示Github动态的方式,支持展示Github基本信息、编码语言分布、仓库信息。最常用的还是Github基本信息和仓库信息。</p><p><img src="https://sumygg.com/2021/04/25/beautify-your-github-profile-readme/github-stats.png" alt="github-stats"></p><p>引用也是非常简单,按照仓库的[说明文档](<a href="https://github.com/anuraghazra/github-readme-stats/blob/master/docs/readme_cn.md">github-readme-stats/readme_cn.md at master · anuraghazra/github-readme-stats</a>),将其中的用户名替换成自己的用户名即可。</p><h4 id="3-2Awesome-READMEs"><a href="#3-2Awesome-READMEs" class="headerlink" title="3.2Awesome READMEs"></a>3.2Awesome READMEs</h4><p>如果没有灵感,可以参考一下其他人的Github个人信息页。这里有个仓库收集了一些人的Github信息页,可以翻翻参考一下。</p><p><a href="https://github.com/kautukkundan/Awesome-Profile-README-templates">https://github.com/kautukkundan/Awesome-Profile-README-templates</a></p><h4 id="3-3访问计数"><a href="#3-3访问计数" class="headerlink" title="3.3访问计数"></a>3.3访问计数</h4><p>可以添加访问计数的徽章,这类服务不少,也可以自己搭建一个。这里列举一些只需要将其中的用户名替换成自己的用户名。</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs awk">![muzihuaner](https:<span class="hljs-regexp">//</span>komarev.com<span class="hljs-regexp">/ghpvc/</span>?username=muzihuaner)<br>![muzihuaner](https:<span class="hljs-regexp">//</span>visitor-badge.glitch.me/badge?page_id=muzihuaner.profile)<br><img src=<span class="hljs-string">"https://count.getloli.com/get/@:muzihuaner"</span> alt=<span class="hljs-string">":muzihauner"</span> /><br></code></pre></td></tr></table></figure><h4 id="3-4图标徽章"><a href="#3-4图标徽章" class="headerlink" title="3.4图标徽章"></a>3.4图标徽章</h4><p>很多仓库都有这类图标徽章<a href="https://img.shields.io/badge/github-%2324292e.svg?&style=for-the-badge&logo=github&logoColor=white"><img src="https://img.shields.io/badge/github-%2324292e.svg?&style=for-the-badge&logo=github&logoColor=white" alt="github"></a>github,<a href="https://shields.io/">https://shields.io/</a> 提供了好多预制的徽章信息可供选择。</p><p>除了预制的徽章,shields也能自定义徽章样式。先从 <a href="https://simpleicons.org/">https://simpleicons.org/</a> 选择一个图标,shields支持直接使用simpleicons的图标。然后按照对应部分修改或替换到地址中,具体参数还是继续查看官网说明吧。</p><h4 id="3-5模板"><a href="#3-5模板" class="headerlink" title="3.5模板"></a>3.5模板</h4><p>各种布局、配件、模板真是挑花了了眼,尤其是其中技能图标,一个一个找好麻烦。幸好这里有一个Github <a href="https://profilinator.rishav.dev/">profilinator</a>模板生成器,一部分一部分的选择,可以快速生成需要的首页信息。</p><p>生成的README.md文件不只是局限于使用他的模板,更重要的是将其中的元素提取出来,复用其中的元素。比如技能图标Vue.js等<a href="https://profilinator.rishav.dev/skills-assets/vuejs-original-wordmark.svg"><img src="https://profilinator.rishav.dev/skills-assets/vuejs-original-wordmark.svg" alt="Vue.js"></a></p><h3 id="我的成果"><a href="#我的成果" class="headerlink" title="我的成果"></a>我的成果</h3><p>最后我的首页就是这样子了,欢迎前来参观。</p><p><a href="https://github.com/muzihuaner">muzihuaner (木子欢儿~) (github.com)</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210802144514.png" alt="image-20210802144514608"></p><h3 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h3><ul><li><a href="https://zhuanlan.zhihu.com/p/265462490">Github个人首页美化指北</a></li></ul>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Github</tag>
<tag>markdown</tag>
<tag>Readme</tag>
</tags>
</entry>
<entry>
<title>Nexus9刷机全纪录</title>
<link href="/2021/06/29/Nexus9%E5%88%B7%E6%9C%BA%E5%85%A8%E7%BA%AA%E5%BD%95/"/>
<url>/2021/06/29/Nexus9%E5%88%B7%E6%9C%BA%E5%85%A8%E7%BA%AA%E5%BD%95/</url>
<content type="html"><![CDATA[<p>最近从某海鲜市场花了200软妹币购买了Nexus9,2+32GB的,具体参数可以看<a href="https://product.pconline.com.cn/tabletpc/google/571146_detail.html">这里</a>,NVIDIA Tegra K1的CPU</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210629143729.png"></p><p>原系统是谷歌原生7.X,把玩了半天,发现卡的不能,所以还是刷个鸡吧!顺便记录一下</p><h1 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h1><h2 id="1-解锁BL锁"><a href="#1-解锁BL锁" class="headerlink" title="1.解锁BL锁"></a>1.解锁BL锁</h2><p><strong>下载安装Nexus Root Toolkit</strong></p><p>官方:</p><p><a href="https://androidfilehost.com/?fid=24728673521238129">NRT_v2.1.9.sfx.exe | by WugFresh for Generic Device/Other (androidfilehost.com)</a></p><p>我的网盘:</p><p><a href="https://huangenet.lanzoui.com/iDtZZqtet5i">NRT_v2.1.9.sfx.exe - 蓝奏云 (lanzoui.com)</a></p><p>一路next安装好后,按照图示数字开启刷机之旅……</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210629144612.png"></p><p>开发者选项,打开 OEM 锁,打开 USB 调试<br>点 unlock 解锁(好像也可以用命令 [adb fastboot flashing unlock / fastboot oem unlock]</p><p>装 adb 环境(好像装 nexus root toolkit 时会自动把 adb 也装上)</p><p>解锁好后 进入bootloader 会显示 unlocked</p><h2 id="2-安装第三方REC-twrp"><a href="#2-安装第三方REC-twrp" class="headerlink" title="2.安装第三方REC-twrp"></a>2.安装第三方REC-twrp</h2><p><strong>下载(下载最新版本即可):</strong></p><p><a href="https://twrp.me/">TeamWin - TWRP</a></p><p><strong>拷贝twrp到指定目录</strong><br>以twrp-3.5.2_9-0-flounder.img为例,将twrp-3.5.2_9-0-flounder.img拷贝到Nexus Root Toolkit的默认安装目录下</p><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs livescript">C:<span class="hljs-string">\Program</span> Files (x86)<span class="hljs-string">\WugFresh</span> Development<span class="hljs-string">\Nexus</span> Root Toolkit<span class="hljs-string">\data</span><br></code></pre></td></tr></table></figure><p><strong>进入bootloader模式</strong><br>设备关机,****同时按住电源键和音量键上(直到进入界面后方可松开)****,选择进入bootloader模式</p><p>当然你也可以用命令</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">adb reboot bootloade</span><br></code></pre></td></tr></table></figure><p><strong>刷入twrp</strong><br>在dos模式下进入C:\Program Files (x86)\WugFresh Development\Nexus Root Toolkit\data目录,输入如下命令:</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">fastboot</span> flash recovery twrp-<span class="hljs-number">3</span>.<span class="hljs-number">5</span>.<span class="hljs-number">2</span>_9-<span class="hljs-number">0</span>-flounder.img<br></code></pre></td></tr></table></figure><p>之后</p><figure class="highlight llvm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs llvm">fastboot boot twrp-<span class="hljs-keyword">x</span>.<span class="hljs-keyword">x</span>.<span class="hljs-keyword">x</span>-<span class="hljs-keyword">x</span>.img<br></code></pre></td></tr></table></figure><p>进入REC模式</p><p><strong>之后的操作都在 twrp 里进行</strong></p><h2 id="3-刷机"><a href="#3-刷机" class="headerlink" title="3.刷机"></a>3.刷机</h2><p>⑴<strong>备份</strong>(也可以忽略)</p><p>* 点 backup<br>* 命令 [adb pull xxx xxx] 保存到电脑里</p><p>(2)<strong>清除数据</strong>(三清)<br>点 wipe,全选<br>点 format data </p><p>还有一个滑动的那个也执行了</p><p>(3)<strong>刷机</strong></p><p>命令 [adb push xxx /sdcard/] 把需要装的包传进手机</p><p>①点 install,刷 [驱动] <a href="https://androidfilehost.com/?fid=817906626617936176">vendor-flounder-n9f27m.img</a>,在文件列表的右下角,点 install image 才会显示 img 后缀的文件</p><p>②点 install,刷 [系统] <a href="https://androidfilehost.com/?w=files&flid=149860&sort_by=date&sort_dir=DESC">Resurrection Remix Oreo for Nexus 9</a></p><p> ③点 install,刷 [内核] <a href="https://elementalx.org/devices/nexus-9/">ElementalX-N9</a> (8.1.0的那个)</p><p>④点 install,刷 [gapps] <a href="https://opengapps.org/?arch=arm64&api=8.1&variant=nano">The Open GApps Project</a></p><p>⑤点 install,刷 [root] <a href="https://huangenet.lanzoui.com/ilj6Hqtgfij">root包</a></p><p><a href="https://huangenet.lanzoui.com/iB0lqqtisne">SuperSU-v2.82-nexus9</a></p><p>⑥刷机完成</p><h2 id="4-跳过激活"><a href="#4-跳过激活" class="headerlink" title="4.跳过激活"></a>4.<strong>跳过激活</strong></h2><p>原因你懂的,安装android原生系统后,无法在wifi环境下激活,因此强烈推荐手工修改系统文件跳过激活步骤</p><p>A、设备关机,同时按住电源键和音量键(直到进入界面后方可松开),进入bootloader状态</p><p>B、选择音量增减键进入recovery模式</p><p>C、选择界面中mount,勾选system分区并挂载</p><p>D、adb修改系统文件</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs awk">cd C:\Program Files (x86)\WugFresh Development\Nexus Root Toolkit\data<br>adb shell<br>echo <span class="hljs-string">"ro.setupwizard.mode=DISABLED"</span> >> <span class="hljs-regexp">/system/</span>build.prop<br><span class="hljs-keyword">exit</span><br>adb reboot<br></code></pre></td></tr></table></figure><p>小伙伴终于可以愉快玩耍了</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210629151718.png"></p><p>平板应用推荐</p><p><a href="https://www.coolapk.com/album/28085545">https://www.coolapk.com/album/28085545</a></p><p>参考文档:</p><p><a href="https://blog.csdn.net/chj113/article/details/96460552">nexus9刷机全记录_chj113的专栏-CSDN博客_nexus9刷机</a></p><p><a href="https://tieba.baidu.com/p/5987428550">刷机 全过程 记录 LineageOS 14.1 Nexus 9 (Wi-Fi)【nexus9吧】_百度贴吧 (baidu.com)</a></p><p>[<a href="https://forum.xda-developers.com/t/rom-official-lineageos-14-1-for-nexus-9-flounder.3617907/">ROM][OFFICIAL] LineageOS 14.1 for Nexus 9 (flounder) | XDA Forums (xda-developers.com)</a></p><p>[<a href="https://www.cyanogenmods.org/forums/topic/resurrection-remix-oreo-for-nexus-9-android-8-1/">RR OREO] Nexus 9 Resurrection Remix OREO 8. 1 Download (cyanogenmods.org)</a></p><p>[<a href="https://forum.xda-developers.com/t/kernel-january-29-elementalx-n9-5-17-nougat-7-03-oreo.2931657/">KERNEL] [January 29] ElementalX-N9 5.17 (Nougat) 7.03 (Oreo) | XDA Forums (xda-developers.com)</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Nexus9</tag>
</tags>
</entry>
<entry>
<title>树莓派自动化推流摄像头到Bilibili直播</title>
<link href="/2021/06/12/%E6%A0%91%E8%8E%93%E6%B4%BE%E8%87%AA%E5%8A%A8%E5%8C%96%E6%8E%A8%E6%B5%81%E6%91%84%E5%83%8F%E5%A4%B4%E5%88%B0Bilibili%E7%9B%B4%E6%92%AD/"/>
<url>/2021/06/12/%E6%A0%91%E8%8E%93%E6%B4%BE%E8%87%AA%E5%8A%A8%E5%8C%96%E6%8E%A8%E6%B5%81%E6%91%84%E5%83%8F%E5%A4%B4%E5%88%B0Bilibili%E7%9B%B4%E6%92%AD/</url>
<content type="html"><![CDATA[<p>树莓派/玩客云闲置怎么办?用来直播推流呀</p><p><a href="https://github.com/withsalt/BilibiliLiveTools">withsalt/BilibiliLiveTools: Bilibili直播工具</a></p><p>直播间演示:</p><p><a href="https://live.bilibili.com/21577989">https://live.bilibili.com/21577989</a></p><p><strong>准备工作</strong></p><p>(1)前提条件</p><p>a.首先要有一个树莓派,并连接了摄像头(USB摄像头)。并能够访问网络。<br>b.在Bilibili中通过实名认证,并开通了直播间。<a href="https://link.bilibili.com/p/center/index">点击连接</a>开通直播间(很简单的,实名认证通过后直接就可以开通了)<br>c.FFmpeg。推流默认使用FFmpeg,树莓派官方系统默认安装了的,我就不再赘述,其它系统请自行安装。</p><p>(2)获取程序</p><p>下载编译好的程序:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">wget https://github.com/withsalt/BilibiliLiveTools/releases/download/2.0.2/BilibiliLiver_Linux_ARM.zip<br></code></pre></td></tr></table></figure><p>(2)解压并授权</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">unzip BilibiliLiver_Linux_ARM.zip && <span class="hljs-built_in">chmod</span> -R 755 BilibiliLiver_Linux_ARM && <span class="hljs-built_in">chmod</span> +x BilibiliLiver_Linux_ARM/BilibiliLiver<br></code></pre></td></tr></table></figure><p>(3)编辑配置文件</p><p>编辑用户配置文件User.json</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> BilibiliLiver_Linux_ARM/<br>nano appsettings.json<br></code></pre></td></tr></table></figure><p>编辑直播配置文件</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs json"><span class="hljs-punctuation">{</span><br> <span class="hljs-attr">"AppSetting"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><br> <span class="hljs-comment">//加密密钥,一般不需要修改,要修改的话,至少需要16位</span><br> <span class="hljs-attr">"Key"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"ac131de1-ed20-499f-8fdf-dede054dbaad"</span><br> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"LiveSetting"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><br> <span class="hljs-comment">//直播间分类</span><br> <span class="hljs-attr">"LiveCategory"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"369"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-comment">//直播间名称</span><br> <span class="hljs-attr">"LiveRoomName"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"【24H】小金鱼啦~"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-comment">//FFmpeg推流命令,请自行填写对应操作系统和设备的推流命令,默认为树莓派,且摄像头设备为‘/dev/video0’</span><br> <span class="hljs-comment">//填写到此处时,请注意将命令中‘"’用‘\’进行转义,将推流的rtmp连接替换为[[URL]],[[URL]]不需要双引号。</span><br> <span class="hljs-attr">"FFmpegCmd"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"ffmpeg -f dshow -video_size 1280x720 -i video=\"5M USB CAM\" -vcodec libx264 -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 5000k -an -preset:v ultrafast -tune:v zerolatency -f flv [[URL]]"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-comment">//ffmpeg异常退出后,是否自动重新启动</span><br> <span class="hljs-attr">"AutoRestart"</span><span class="hljs-punctuation">:</span> <span class="hljs-keyword">true</span><br> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"UserSetting"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><br> <span class="hljs-comment">//B站账号</span><br> <span class="hljs-attr">"Account"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"*********"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-comment">//B站密码,放心填写,没有后门</span><br> <span class="hljs-attr">"Password"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"*********"</span><br> <span class="hljs-punctuation">}</span><br><span class="hljs-punctuation">}</span><br></code></pre></td></tr></table></figure><p>由于推流方式不同以及FFmpeg配置的多边性,这里采用直接填写推流命令的方式。建议填写之前先测试推流命令能否正确执行。默认的推流命令设配树莓派官方系统,其它系统可能不适用,需要自己修改。</p><p>推流命令(FFmpegCmd)中的“[[URL]]”,是一个配置符号,将在程序中被替换为获取到的Bilibili推流地址,所以一定要在最终命令中,把测试文件或者地址修改为 “[[URL]]”(URL大写) ,否则程序将抛出错误。推流命令中注意半角双引号需要用符号‘\’来进行转义。</p><p>FFmpeg的使用请查看最后一节:FFmpeg的使用</p><p><strong>开始直播</strong></p><p>执行推流程序。推流程序将会自动开启B站直播,并获取推流地址,然后执行预设的FFmpeg推流命令。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo ./BilibiliLiver<br></code></pre></td></tr></table></figure><p>输出下面的就表示开始直播啦~</p><p><img src="https://www.quarkbook.com/wp-content/uploads/2019/09/image-12-1024x424.png" alt="树莓派自动化推流摄像头到Bilibili直播">开始直播输出</p><p>如果希望在后台持续直播,可以将上面一条命令替换为:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo <span class="hljs-built_in">nohup</span> ./BilibiliLiver /dev/null 2>live.log<br></code></pre></td></tr></table></figure><p>程序将会在后台运行。</p><p>或者编写一个系统服务,设置开机启动,控制开始关闭推流什么的。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo nano /etc/systemd/system/bilibiliLiver.service<br></code></pre></td></tr></table></figure><p>将下方代码中的执行路径替换为BilibiliLiver程序所在的<strong>绝对路径</strong>。比如“/home/pi/BilibiliLiver_Linux_ARM/BilibiliLiver”,注意大小写。</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[Unit]</span><br><span class="hljs-attr">Description</span>=BilibiliLiver<br><span class="hljs-attr">After</span>=network.target<br><br><span class="hljs-section">[Service]</span><br><span class="hljs-attr">WorkingDirectory</span>=BilibiliLiver所在路径,比如/home/pi/BilibiliLiver_Linux_ARM<br><span class="hljs-attr">ExecStart</span>=BilibiliLiver所在路径包含程序的路径,比如/home/pi/BilibiliLiver_Linux_ARM/BilibiliLiver<br><span class="hljs-attr">Restart</span>=always<br><span class="hljs-attr">SyslogIdentifier</span>=BilibiliLiver Tool<br><span class="hljs-attr">User</span>=root<br><span class="hljs-attr">Environment</span>=ASPNETCORE_ENVIRONMENT=Production<br><br><span class="hljs-section">[Install]</span><br><span class="hljs-attr">WantedBy</span>=multi-user.target<br></code></pre></td></tr></table></figure><p>执行start,开启推流服务。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo systemctl start bilibiliLiver<br></code></pre></td></tr></table></figure><p>检查命令是否配置正确已经程序是否正常工作。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo systemctl status bilibiliLiver<br></code></pre></td></tr></table></figure><p>其它服务维护命令。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo systemctl stop bilibiliLiver <span class="hljs-comment">#停止推流服务</span><br>sudo systemctl <span class="hljs-built_in">enable</span> bilibiliLiver <span class="hljs-comment">#设置开机启动</span><br>sudo systemctl <span class="hljs-built_in">disable</span> bilibiliLiver <span class="hljs-comment">#禁用开机启动</span><br></code></pre></td></tr></table></figure><p><strong>FFmpeg的使用</strong></p><p>无论是Windows还是Linux,运行环境无论是PC还是树莓派,如果使用FFmpeg推流,都要在上面安装好FFmpeg,并在命令行中执行ffmpeg -version后可以准确的获取ffmpeg的相关信息。</p><p><img src="https://www.quarkbook.com/wp-content/uploads/2019/10/image-5-1024x360.png" alt="树莓派自动化推流摄像头到Bilibili直播">ffmpeg命令行输出</p><p>至于如何在各种环境中安装ffmpeg我就不在此赘述,网上有很多详细的教程。树莓派官方系统是内置了ffmpeg的,不用自己再编译安装。</p><p>以下是树莓派Raspbian系统中推流命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs sh"><span class="hljs-comment">#推流USB摄像头(包含音频,音频源为音频文件)</span><br>ffmpeg -thread_queue_size 512 -f video4linux2 -s 1280*720 -input_format mjpeg -i <span class="hljs-string">"视频源"</span> -stream_loop -1 -i <span class="hljs-string">"音频源"</span> -vcodec h264_omx -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 10M -bufsize 10M -acodec aac -ac 2 -ar 44100 -ab 128k -f flv <span class="hljs-string">"推流地址"</span><br><br><span class="hljs-comment">#推流USB摄像头(包含音频,音频源麦克风)</span><br>ffmpeg -thread_queue_size 512 -f video4linux2 -s 1280*720 -input_format mjpeg -i <span class="hljs-string">"视频源"</span> -i <span class="hljs-string">"音频源"</span> -vcodec h264_omx -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 10M -bufsize 10M -acodec aac -ac 2 -ar 44100 -ab 128k -f flv <span class="hljs-string">"推流地址"</span><br><br><span class="hljs-comment">#推流USB摄像头(不包含音频)</span><br>ffmpeg -thread_queue_size 512 -f video4linux2 -s 1280*720 -i <span class="hljs-string">"视频源"</span> -vcodec h264_omx -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 10M -bufsize 10M -an -f flv <span class="hljs-string">"推流地址"</span><br><br><span class="hljs-comment">#推流视频</span><br>ffmpeg -re -i <span class="hljs-string">"视频源"</span> -vcodec copy -acodec aac -b:a 192k -f flv <span class="hljs-string">"推流地址"</span> <br></code></pre></td></tr></table></figure><p>以下是Windows系统中推流命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs sh"><span class="hljs-comment">#推流USB摄像头(包含音频,音频源为音频文件)</span><br>ffmpeg -f dshow -s 1280*720 -r 1024 -i video=<span class="hljs-string">"视频源"</span> -stream_loop -1 -i <span class="hljs-string">"音频源"</span> -vcodec libx264 -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 5000k -acodec aac -ac 2 -ar 44100 -ab 128k -preset:v ultrafast -tune:v zerolatency -f flv <span class="hljs-string">"推流地址"</span><br><br><span class="hljs-comment">#推流USB摄像头(包含音频,音频源麦克风)</span><br>ffmpeg -f dshow -s 1280*720 -r 1024 -i video=<span class="hljs-string">"视频源"</span> -i <span class="hljs-string">"音频源"</span> -vcodec libx264 -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 5000k -acodec aac -ac 2 -ar 44100 -ab 128k -preset:v ultrafast -tune:v zerolatency -f flv <span class="hljs-string">"推流地址"</span><br><br><span class="hljs-comment">#推流USB摄像头(不包含音频)</span><br>ffmpeg -f dshow -s 1280*720 -r 1024 -i video=<span class="hljs-string">"视频源"</span> -vcodec libx264 -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 5000k -an -preset:v ultrafast -tune:v zerolatency -f flv <span class="hljs-string">"推流地址"</span><br><br><span class="hljs-comment">#推流视频</span><br>ffmpeg -re -i <span class="hljs-string">"视频源"</span> -vcodec copy -acodec aac -b:a 192k -f flv <span class="hljs-string">"推流地址"</span> <br></code></pre></td></tr></table></figure><p>以上命令没有经过仔细测试,不同环境需要不同的参数,请自行学习FFmpeg的用法。</p><p>FFmpeg基本用法:</p><p>ffmpeg [全局选项] {[输入文件选项] -i 输入文件} … {[输出文件选项] 输出文件} …</p><p>参数简单介绍:</p><ul><li>-f:输入格式(video4linux2 )</li><li>-i:输入源</li><li>-s:视频分辨率</li><li>-r:所需的帧率</li><li>-vcodec:视频编解码器</li><li>-vb:视频比特率</li><li>-bufsize:缓冲区大小(对于流来说很重要)</li><li>-vf:像素格式</li><li>-g:GOP(图片组,对于流式传输很重要)</li><li>-an:不使用音频</li><li>-f:输出格式</li></ul><p><a href="https://huangenet.lanzoui.com/i7RjTq47fwj">ffmpeg翻译文档.pdf - 蓝奏云 (lanzoui.com)</a></p><p>树莓派在使用FFmpeg推流时,帧数大概在10帧左右,这个帧数并不理想,而且还在用树莓派硬件解码的情况下。但是也是目前我能找到的最优解了</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>树莓派</tag>
<tag>玩客云</tag>
<tag>FFmpeg</tag>
</tags>
</entry>
<entry>
<title>在玩客云上部署code-server</title>
<link href="/2021/06/05/%E5%9C%A8%E7%8E%A9%E5%AE%A2%E4%BA%91%E4%B8%8A%E9%83%A8%E7%BD%B2code-server/"/>
<url>/2021/06/05/%E5%9C%A8%E7%8E%A9%E5%AE%A2%E4%BA%91%E4%B8%8A%E9%83%A8%E7%BD%B2code-server/</url>
<content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><a href="https://coder.com/">Code-server</a> 是在远程服务器上运行的VS Code,通过浏览器访问。</p><ul><li>在你的Chromebook、平板、笔记本上用一样的环境来进行开发</li><li>如果你有Windows或Mac工作站,也可以轻松地在Linux上开发</li><li>利用云服务器来加快测试、编译、下载等操作</li><li>不论在哪永远在线</li><li>所有的计算都在云端进行</li><li>不需要再运行过多的Chrome实例</li></ul><p>Code-server → <a href="https://coder.com/">https://coder.com/</a></p><p>GitHub → <a href="https://github.com/linuxserver/docker-code-server">https://github.com/linuxserver/docker-code-server</a></p><p>Docker Hub → <a href="https://hub.docker.com/r/linuxserver/code-server">https://hub.docker.com/r/linuxserver/code-server</a></p><h2 id="支持的系统架构"><a href="#支持的系统架构" class="headerlink" title="支持的系统架构"></a>支持的系统架构</h2><p>得益于docker的跨平台属性,我们的镜像也支持多架构(如,x86-64、arm64、armhf)。</p><p>直接拉取 <code>ghcr.io/linuxserver/code-server</code> 应该就可以自动获取适合你系统架构的版本,当然你也可以通过 tag 获取特定的版本。</p><table><thead><tr><th>架构</th><th>Tag</th></tr></thead><tbody><tr><td>x86-64</td><td>amd64-latest</td></tr><tr><td>arm64</td><td>arm64v8-latest</td></tr><tr><td>armhf</td><td>arm32v7-latest</td></tr></tbody></table><hr><p><strong>玩客云是32位的,所以也可以用这个</strong></p><h2 id="部署方法"><a href="#部署方法" class="headerlink" title="部署方法"></a>部署方法</h2><p>你需要先安装好Docker ,方法自行百度</p><p><strong>部署命令</strong></p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs routeros">docker <span class="hljs-built_in">run</span> -d \<br> <span class="hljs-attribute">--name</span>=code-server \<br> -e <span class="hljs-attribute">PUID</span>=1000 \<br> -e <span class="hljs-attribute">PGID</span>=1000 \<br> -e <span class="hljs-attribute">TZ</span>=Europe/London \<br> -e <span class="hljs-attribute">PASSWORD</span>=password \<br> -e <span class="hljs-attribute">SUDO_PASSWORD</span>=password \<br> -e <span class="hljs-attribute">PROXY_DOMAIN</span>=code-server.my.domain \<br> -p 8443:8443 \<br> -v /path/<span class="hljs-keyword">to</span>/appdata/config:<span class="hljs-built_in">/config </span>\<br> --restart unless-stopped \<br> linuxserver/code-server<br></code></pre></td></tr></table></figure><h2 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h2><p>Docker镜像在使用的时候需要配置一些参数,这些参数使用 <code>:</code> 分隔,分别表示 <code>宿主机:容器内</code>。例如 <code>-p 8080:80</code> 指的是将容器内的<code>80</code>端口映射到宿主机上的<code>8080</code>端口,即通过宿主机网络访问的话,访问<code>8080</code>端口即是访问容器内的<code>80</code>端口。</p><h3 id="端口(-p)"><a href="#端口(-p)" class="headerlink" title="端口(-p)"></a>端口(-p)</h3><table><thead><tr><th>port</th><th>说明</th></tr></thead><tbody><tr><td><code>8443</code></td><td>WEB界面</td></tr></tbody></table><h3 id="环境变量(-e)"><a href="#环境变量(-e)" class="headerlink" title="环境变量(-e)"></a>环境变量(-e)</h3><table><thead><tr><th>env</th><th>说明</th></tr></thead><tbody><tr><td><code>PUID=1000</code></td><td>用户的 UID,详见下面的说明</td></tr><tr><td><code>PGID=1000</code></td><td>用户的 GID,详见下面的说明</td></tr><tr><td><code>TZ=Europe/London</code></td><td>设置时区,在国内的话可以使用 Asia/Shanghai</td></tr><tr><td><code>PASSWORD=password</code></td><td>Web界面的密码,如果不设置则不会启用认证</td></tr><tr><td><code>SUDO_PASSWORD=password</code></td><td>如果设置了该项,则在服务器的终端上用该密码使用sudo</td></tr><tr><td><code>PROXY_DOMAIN=code-server.my.domain</code></td><td>反向代理相关的设置,<a href="https://github.com/cdr/code-server/blob/master/doc/FAQ.md#sub-domains">具体参阅这里</a></td></tr></tbody></table><h3 id="卷映射(-v)"><a href="#卷映射(-v)" class="headerlink" title="卷映射(-v)"></a>卷映射(-v)</h3><table><thead><tr><th>volume</th><th>说明</th></tr></thead><tbody><tr><td><code>/config</code></td><td>配置文件所在路径</td></tr></tbody></table><h2 id="从文件加载环境变量"><a href="#从文件加载环境变量" class="headerlink" title="从文件加载环境变量"></a>从文件加载环境变量</h2><p>可以使用前缀名为 <code>FILE__</code> 的文件来加载环境变量。</p><p>例:</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arcade">-e FILE__PASSWORD=<span class="hljs-regexp">/run/</span>secrets/mysecretpassword<br></code></pre></td></tr></table></figure><p>将把 <code>/run/secrets/mysecretpassword</code> 文件中的内容作为 <code>PASSWORD</code> 变量的值。</p><h2 id="UID和GID"><a href="#UID和GID" class="headerlink" title="UID和GID"></a>UID和GID</h2><p>当使用 <code>-v</code> 映射卷的时候,宿主机和容器内会出现关于权限的问题,我们的镜像可以通过指定 <code>PUID</code> 和 <code>GUID</code> 来避免此类问题。</p><p>可以使用你目前正在使用的用户的UID和GID进行设置,这样就不会存在权限问题。</p><p>可以通过如下的方式查看当前用户的UID和GID:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta">$ </span><span class="language-bash"><span class="hljs-built_in">id</span> <span class="hljs-variable">$user</span></span><br> uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup)<br></code></pre></td></tr></table></figure><h2 id="安装说明"><a href="#安装说明" class="headerlink" title="安装说明"></a>安装说明</h2><p>访问WEB界面:<code>http://ip:8443</code></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210605150345.png" alt="image-20210605150345025"></p><p>如果要使用GitHub,把ssh密钥放在 /config/.ssh 文件夹</p><p>然后在菜单中打开终端,设置github的用户名和邮箱</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs stylus">git config <span class="hljs-attr">--global</span> user<span class="hljs-selector-class">.name</span> <span class="hljs-string">"username"</span><br>git config <span class="hljs-attr">--global</span> user<span class="hljs-selector-class">.email</span> <span class="hljs-string">"email address"</span><br></code></pre></td></tr></table></figure><p>想换成中文,在拓展那里搜索“Chinese”,找到“简体中文”安装,重新加载页面即可。</p><p>哈哈哈,快去压榨玩客云的性能吧!</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>VsCode</tag>
<tag>玩客云</tag>
</tags>
</entry>
<entry>
<title>基于宝塔面板的Google镜像网站设置教程</title>
<link href="/2021/05/20/%E5%9F%BA%E4%BA%8E%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E7%9A%84Google%E9%95%9C%E5%83%8F%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE%E6%95%99%E7%A8%8B/"/>
<url>/2021/05/20/%E5%9F%BA%E4%BA%8E%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E7%9A%84Google%E9%95%9C%E5%83%8F%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE%E6%95%99%E7%A8%8B/</url>
<content type="html"><![CDATA[<h2 id="建立站点"><a href="#建立站点" class="headerlink" title="建立站点"></a>建立站点</h2><p>在宝塔面板后台点击:<strong>网站-添加站点-输入网站域名</strong></p><h2 id="反向代理设置"><a href="#反向代理设置" class="headerlink" title="反向代理设置"></a>反向代理设置</h2><p>安装面板后新建站点,然后设置站点选择反向代理(如下图所示)<br><a href="http://blog.chauncey09.com/usr/uploads/2019/08/3707359233.png"><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210520192934.png" alt="img"></a></p><p>然后设置反向代理</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs stylus">目标URL是: https:<span class="hljs-comment">//www.google.com.hk</span><br>发送域名也是: www<span class="hljs-selector-class">.google</span><span class="hljs-selector-class">.com</span><span class="hljs-selector-class">.hk</span><br><br><br>#注意:目标URL一定是www<span class="hljs-selector-class">.google</span><span class="hljs-selector-class">.com</span><span class="hljs-selector-class">.hk</span> 后缀为二级区域域名.hk或者.sg。<br>否则会出现无法反代,连续多跳的问题。<br></code></pre></td></tr></table></figure><h2 id="SSL设置"><a href="#SSL设置" class="headerlink" title="SSL设置"></a>SSL设置</h2><p>点击SSL-开启https强制运行(这一步一定要有,因为谷歌目前已经强制https,所以镜像站点同样要以https运行)</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Google</tag>
<tag>宝塔</tag>
</tags>
</entry>
<entry>
<title>小米路由器mini刷openwrt系统</title>
<link href="/2021/04/24/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1%E5%99%A8mini%E5%88%B7openwrt%E7%B3%BB%E7%BB%9F/"/>
<url>/2021/04/24/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1%E5%99%A8mini%E5%88%B7openwrt%E7%B3%BB%E7%BB%9F/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://www.mi.com/miwifilite/specs">这个路由器</a>有16M的ROM,还能装点东西,比斐讯K2还是好使得多,可以刷功能较齐备的openwrt,顺便搞个去广告,科学上网等</p><h1 id="刷机步骤"><a href="#刷机步骤" class="headerlink" title="刷机步骤"></a>刷机步骤</h1><p>小米路由器要刷其他系统,需要先获得SSH权限,而获得SSH权限则需要先刷开发版</p><p>只有开发版系统才能开启SSH权限,所以第一步我们需要将路由器系统刷为开发版。<br>到<a href="http://www.miui.com/thread-1776173-1-1.html">小米路由官网</a>去下载开发版系统ROM,建议直接刷这个版本<a href="http://bigota.miwifi.com/xiaoqiang/rom/r1cm/miwifi_r1cm_firmware_426e6_0.8.11.bin">小米路由器mini MiWiFi 开发版 0.8.11</a></p><blockquote><p>非常重要,如果版本高了,不能开启SSH,版本低了没有修改root用户的api。</p></blockquote><h3 id="刷开发版"><a href="#刷开发版" class="headerlink" title="刷开发版"></a>刷开发版</h3><p>刷入开发版非常简单,步骤如下:</p><ol><li>将上面下载好的固件改名为:<code>miwifi.bin</code> ,放入一个U盘的根目录,U盘需要是 <code>FAT32</code> 格式</li><li>U盘插到路由屁股上,拿根取卡针等尖头物件顶住 <code>reset</code> ,然后插入电源</li><li>路由器指示灯先会常亮黄色,等指示灯狂闪后就可以松开 <code>reset</code> 了,然后静候路由器指示灯变成蓝色</li></ol><p>以上做完就完成刷入开发版的步骤了。如果指示灯是红色,那么代表这个固件有问题,重新更换固件,断电再走一遍流程就可以了,不用担心会变砖。</p><h3 id="开启SSH权限"><a href="#开启SSH权限" class="headerlink" title="开启SSH权限"></a>开启SSH权限</h3><p>系统刷好开发版后,我们就可以开启系统的SSH权限了。开启SSH权限,需要登录<a href="http://d.miwifi.com/rom/ssh">官方网站</a>下载对应的工具包:</p><ol><li>请将下载的工具包 <code>bin</code> 文件复制到U盘(<code>FAT/FAT32</code> 格式)的根目录下,保证文件名为 <code>miwifi_ssh.bin</code> 「如果之前刷开发版用的同一个U盘,那之前放的 <code>miwifi.bin</code> 删除掉不需要多说吧?」;</li><li>断开小米路由器的电源,将U盘插入USB接口;</li><li>抵住 <code>reset</code> 按钮之后重新插上电源,指示灯变为黄色闪烁状态即可松开 <code>reset</code> 键;</li><li>等待3-5秒后安装完成之后,小米路由器会自动重启</li></ol><blockquote><p>官方给每个账号提供了一个随机的root密码,为了管理方便,我们可以登录后用 <code>passwd</code> 命令将root密码改成我们自己好记得的</p></blockquote><p>刷完 <code>miwifi_ssh.bin</code> 后,我们可以用Xshell等SSH客户端连接登录路由器,我这里使用的是FinalShell</p><p>如果不成功(红灯)就换个固件或者U盘</p><h3 id="刷Breed"><a href="#刷Breed" class="headerlink" title="刷Breed"></a>刷Breed</h3><p>SSH权限搞定后,我们要做的是换个BootLoder系统,大名鼎鼎的Breed(Boot and Recovery Environment for Embedded Devices)便是不二选择。</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210424200506.png" alt="Breed Web 恢复控制台"></p><p>要刷入Breed也不复杂,操作步骤如下:</p><h3 id="1-下载Breed固件"><a href="#1-下载Breed固件" class="headerlink" title="1.下载Breed固件"></a>1.下载Breed固件</h3><p>在<a href="https://breed.hackpascal.net/">Breed固件列表</a>,查找自己设备所需的版本,小米路由器mini需要的是这个:<a href="https://breed.hackpascal.net/breed-mt7620-xiaomi-mini.bin">breed-mt7620-xiaomi-mini.bin</a></p><h3 id="2-备份原有的BootLoder"><a href="#2-备份原有的BootLoder" class="headerlink" title="2.备份原有的BootLoder"></a>2.备份原有的BootLoder</h3><p>使用SSH客户端连接登录路由系统,输入以下命令:</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arcade">dd <span class="hljs-keyword">if</span>=<span class="hljs-regexp">/dev/m</span>td1 of=<span class="hljs-regexp">/tmp/</span>xiaomi_uboot.bin<br></code></pre></td></tr></table></figure><p>系统返回,说明已经将原来的xiaomi_uboot.bin备份到/tmp:</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">384</span>+<span class="hljs-number">0</span> records in<br><span class="hljs-attribute">384</span>+<span class="hljs-number">0</span> records out<br></code></pre></td></tr></table></figure><p>备份完成后将备份文件下载到本地妥善保存,用不到就最好了。不知道怎么下载?那就扔了不要了吧,就当这步备份操作白做了,反正出了问题自己负责o(<em> ̄︶ ̄</em>)o</p><h3 id="3-刷Breed"><a href="#3-刷Breed" class="headerlink" title="3.刷Breed"></a>3.刷Breed</h3><p>用sftp之类工具把Breed固件上传到 <code>/tmp</code> 目录下,如果不会传那也可以ssh登录路由系统后执行下面的命令直接从网上下载:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs awk">cd /tmp<br>wget http:<span class="hljs-regexp">//</span>down.sobaigu.com<span class="hljs-regexp">/files/</span>breed-mt7620-xiaomi-mini.bin<br></code></pre></td></tr></table></figure><p>这里,我的路由器wget用不了,所以下载<a href="https://winscp.net/eng/docs/lang:chs">WinSCP</a>,把下载好的固件上传到 <code>/tmp</code> 目录下</p><p>然后执行以下写入命令:</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gradle">mtd -r <span class="hljs-keyword">write</span> <span class="hljs-regexp">/tmp/</span>breed-mt7620-xiaomi-mini.bin Bootloader<br></code></pre></td></tr></table></figure><p>眨眼的功夫就刷写完成了,完成后关闭路由拔掉电源,找取卡针之类的尖物件抵住 <code>reset</code> 按钮,插上电源开机,等到路由指示灯狂闪的时候,就可以松开 <code>reset</code> 键,然后在用网线连接在该路由上的Wan口浏览器登录 <code>192.168.1.1</code> 就可以进入 <code>Breed web恢复控制台</code> 界面了,就如上面那个截图。</p><h3 id="刷固件"><a href="#刷固件" class="headerlink" title="刷固件"></a>刷固件</h3><p>在刷固件前,建议使用Breed固件备份功能,将原路由所有的项目备份好以备用,同样的用不到最好。</p><p>因为路由有16M的ROM,所以可选的固件还是蛮多的,潘朵拉,华硕改等固件都行,在此推荐一个,个人觉着还蛮不错的,功能也齐全:<a href="https://www.right.com.cn/forum/thread-423219-1-1.html">小米路由器Mini Lean R9.7.6 自编译固件</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210424201327.png" alt="固件更新"></p><p>选择 <code>固件更新</code> 》点击 <code>固件</code> 右侧的 <code>选择文件</code> ,选择刚下载的固件文件,然后点上传,不一会儿就完成了,新系统默认后台信息为:</p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs dns">IP: <span class="hljs-number">192.168.1.1</span><br>用户: root<br>密码: password<br></code></pre></td></tr></table></figure><p>至此,路由器系统脱胎换骨完成,有广告屏蔽,有科学上网还支持订阅地址,V2Ray,支持局域网网络唤醒设备,提供打印机服务…… 有点小瑕疵,可能有内存泄露开久了会死机,带宽监控统计图表不展示之类的,设置下每周定时重启,完全OK,知足常乐!</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210424201406.png" alt="img"></p><h3 id="更换Wan口的MAC地址"><a href="#更换Wan口的MAC地址" class="headerlink" title="更换Wan口的MAC地址"></a>更换Wan口的MAC地址</h3><p>在SSH中输入</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">vi /etc/config/network<br></code></pre></td></tr></table></figure><p>修改其中一段</p><figure class="highlight gams"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs gams">config <span class="hljs-string">'interface'</span> <span class="hljs-string">'lan'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'type'</span> <span class="hljs-string">'bridge'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'ifname'</span> <span class="hljs-string">'eth0.0'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'proto'</span> <span class="hljs-string">'static'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'netmask'</span> <span class="hljs-string">'255.255.255.0'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'ipaddr'</span> <span class="hljs-string">'192.168.200.1'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'macaddr'</span> <span class="hljs-string">'d8:64:c7:5e:f1:c6'</span><br><br>config <span class="hljs-string">'interface'</span> <span class="hljs-string">'wan'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'ifname'</span> <span class="hljs-string">'eth0.1'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'proto'</span> <span class="hljs-string">'dhcp'</span><br> <span class="hljs-keyword">option</span> <span class="hljs-string">'macaddr'</span> <span class="hljs-string">'d8:64:c7:5e:f1:c6'</span><br></code></pre></td></tr></table></figure><p>修改Wan口Mac地址即可</p><p>之后保存,reboot 重启,就能看到所有修改都生效了。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>小米</tag>
<tag>路由器</tag>
<tag>Openwrt</tag>
</tags>
</entry>
<entry>
<title>为玩客云或树莓派安装LNMP和PhpMyAdmin</title>
<link href="/2021/04/09/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%AE%89%E8%A3%85MySQL%E5%92%8CPhpMyAdmin/"/>
<url>/2021/04/09/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%AE%89%E8%A3%85MySQL%E5%92%8CPhpMyAdmin/</url>
<content type="html"><![CDATA[<h2 id="一、更换国内源,修改为清华镜像源(PS-如果不更换,可能…………)"><a href="#一、更换国内源,修改为清华镜像源(PS-如果不更换,可能…………)" class="headerlink" title="一、更换国内源,修改为清华镜像源(PS. 如果不更换,可能…………)"></a>一、更换国内源,修改为清华镜像源(PS. 如果不更换,可能…………)</h2><p>备份原文件:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo <span class="hljs-built_in">cp</span> /etc/apt/sources.list /etc/apt/sources.list.bak<br>sudo <span class="hljs-built_in">cp</span> /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak<br></code></pre></td></tr></table></figure><p>更改系统源文件:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo vim /etc/apt/sources.list<br></code></pre></td></tr></table></figure><p>将原内容注释掉,然后添加:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sh">deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi<br>deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi<br></code></pre></td></tr></table></figure><p>更改系统源:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo vim /etc/apt/sources.list.d/raspi.list<br></code></pre></td></tr></table></figure><p>将原内容注释并改为</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sh">deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui<br>deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui<br></code></pre></td></tr></table></figure><p>玩客云:</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs awk">deb http:<span class="hljs-regexp">//mi</span>rrors.tuna.tsinghua.edu.cn<span class="hljs-regexp">/ubuntu-ports/</span> focal main restricted universe multiverse<br><span class="hljs-comment"># deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse</span><br><br>deb http:<span class="hljs-regexp">//mi</span>rrors.tuna.tsinghua.edu.cn<span class="hljs-regexp">/ubuntu-ports/</span> focal-security main restricted universe multiverse<br><span class="hljs-comment"># deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse</span><br><br>deb http:<span class="hljs-regexp">//mi</span>rrors.tuna.tsinghua.edu.cn<span class="hljs-regexp">/ubuntu-ports/</span> focal-updates main restricted universe multiverse<br><span class="hljs-comment"># deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse</span><br><br>deb http:<span class="hljs-regexp">//mi</span>rrors.tuna.tsinghua.edu.cn<span class="hljs-regexp">/ubuntu-ports/</span> focal-backports main restricted universe multiverse<br><span class="hljs-comment"># deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse</span><br></code></pre></td></tr></table></figure><p>更新软件包索引</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo apt-get update<br>sudo apt-get upgrade<br></code></pre></td></tr></table></figure><h2 id="一、安装Nginx"><a href="#一、安装Nginx" class="headerlink" title="一、安装Nginx"></a>一、安装Nginx</h2><p>安装Nginx,输入下面的命令</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo apt-get install -y nginx<br></code></pre></td></tr></table></figure><p>安装完毕后启动nginx服务:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo service nginx restart<br></code></pre></td></tr></table></figure><h2 id="二、安装PHP"><a href="#二、安装PHP" class="headerlink" title="二、安装PHP"></a>二、安装PHP</h2><p>安装PHP7.0,输入下面的命令</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo apt-get install -y nginx php7.0-fpm php7.0-cli php7.0-curl php7.0-gd php7.0-mcrypt php7.0-cgi php7.0-mysql php7.0-mbstring<br></code></pre></td></tr></table></figure><p>安装完毕后启动php7.0服务</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo service php7.0-fpm restart<br></code></pre></td></tr></table></figure><h2 id="三、安装MySQL(MariaDB)"><a href="#三、安装MySQL(MariaDB)" class="headerlink" title="三、安装MySQL(MariaDB)"></a>三、安装MySQL(MariaDB)</h2><blockquote><p>「重要前提」上面的 “更新软件包索引” 必须执行成功之后,才能进行安装</p></blockquote><p>安装MySQL(MariaDB)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo apt-get install mariadb-server<br></code></pre></td></tr></table></figure><p>运行 mysql_secure_installation 工具:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo mysql_secure_installation<br></code></pre></td></tr></table></figure><p>根据向导指引进行相关设置:</p><ul><li>第一步: “输入 root 的当前密码:”,默认为空,直接按Enter即可;</li><li>第二步: “设置 root 密码?”,这里请输入 Y 并按 Enter。设置 root 登陆密码确保数据安全。然后向导将要求输入新密码和确认密码。</li><li>第三步: “删除匿名用户?”,输入 Y 或 N 并按 Enter。</li><li>第四步: “禁止远程 root 登录?”,输入 Y 或 N 并按 Enter;根据自己需要设置,我这里设置为N。</li><li>第五步: “删除测试数据库并访问它?”,输入 Y 或 N 并按 Enter。</li></ul><p>开始尽情使用 MySQL 吧:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo mysql -u root -p<br></code></pre></td></tr></table></figure><p>输入前面设置的密码并回车,然后……就和我们平时使用的 mysql 一样了!</p><h2 id="四、配置Nginx-PHP-MySQL"><a href="#四、配置Nginx-PHP-MySQL" class="headerlink" title="四、配置Nginx+PHP+MySQL"></a>四、配置Nginx+PHP+MySQL</h2><p>1.配置Nginx让它能处理 PHP</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo nano /etc/nginx/sites-available/default<br></code></pre></td></tr></table></figure><p>找到下面这段代码:</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-section">location</span> / {<br> <span class="hljs-comment"># First attempt to serve request as file, then</span><br> <span class="hljs-comment"># as directory, then fall back to displaying a 404.</span><br> <span class="hljs-attribute">try_files</span> <span class="hljs-variable">$uri</span> <span class="hljs-variable">$uri</span>/ =<span class="hljs-number">404</span>;<br>}<br></code></pre></td></tr></table></figure><p>在这段代码的{}里面,添加一行代码:index index.html index.htm index.php;</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-section">location</span> / {<br> <span class="hljs-comment"># First attempt to serve request as file, then</span><br> <span class="hljs-comment"># as directory, then fall back to displaying a 404.</span><br> <span class="hljs-attribute">try_files</span> <span class="hljs-variable">$uri</span> <span class="hljs-variable">$uri</span>/ =<span class="hljs-number">404</span>;<br> <span class="hljs-attribute">index</span> index.html index.htm index.php;<br>}<br></code></pre></td></tr></table></figure><p>再找到下面的代码:</p><figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs clean">#location ~ \.php$ {<br> # include snippets/fastcgi-php.conf;<br> #<br> # # With php-fpm (or other unix sockets):<br> # fastcgi_pass unix:/var/run/php/php7<span class="hljs-number">.0</span>-fpm.sock;<br> # # With php-cgi (or other tcp sockets):<br> # fastcgi_pass <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>:<span class="hljs-number">9000</span>;<br> #}<br></code></pre></td></tr></table></figure><p>改为:(注意要去掉location 和 }前面的“#”号)</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-section">location</span> <span class="hljs-regexp">~ \.php$</span> {<br> <span class="hljs-comment"># include snippets/fastcgi-php.conf;</span><br> <span class="hljs-comment">#</span><br> <span class="hljs-comment"># # With php-fpm (or other unix sockets):</span><br> <span class="hljs-attribute">fastcgi_pass</span> unix:/run/php/php7.0-fpm.sock;<br> <span class="hljs-attribute">fastcgi_param</span> SCRIPT_FILENAME <span class="hljs-variable">$document_root</span><span class="hljs-variable">$fastcgi_script_name</span>;<br> <span class="hljs-attribute">include</span> fastcgi_params;<br> <span class="hljs-comment"># # With php-cgi (or other tcp sockets):</span><br> <span class="hljs-comment"># fastcgi_pass 127.0.0.1:9000;</span><br> }<br></code></pre></td></tr></table></figure><p>Ctrl + O 保存再 Ctrl + X 退出。<br>最后重启 Nginx 即可:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo service nginx restart<br></code></pre></td></tr></table></figure><p>测试运行php文件,在/var/www/html/目录下新建一个index.php文件,这里直接su获取最高权限来完成:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs sh">pi@raspberrypi:~ $ su<br>密码:《输入你的root密码》<br>root@raspberrypi:/home/pi<span class="hljs-comment"># cat >/var/www/html/index.php#回车进入编辑状态</span><br><?php<br>phpinfo();<br>?><br></code></pre></td></tr></table></figure><p>好了,用浏览器打开http:// 树莓派的IP你就可以看到熟悉的页面啦!</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210409232609.png" alt="image-20210409232609347"></p><p><strong>配置MySQL,允许远程连接</strong><br>用shell登录mysql:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs sh"><span class="hljs-comment">#默认无密码,直接回车</span><br>mysql -u root -p<br><br><span class="hljs-comment">#设置允许远程连接并修改root密码,123456为root用户的新密码,%代表所有主机</span><br>UPDATE mysql.user SET host=<span class="hljs-string">'%'</span>,authentication_string=PASSWORD(<span class="hljs-string">'123456'</span>), PLUGIN=<span class="hljs-string">'mysql_native_password'</span> WHERE USER=<span class="hljs-string">'root'</span>;<br><br><span class="hljs-comment">#刷新权限</span><br>FLUSH PRIVILEGES;<br><br><span class="hljs-comment">#退出myslq</span><br><span class="hljs-built_in">exit</span><br><br><span class="hljs-comment">#重启mysql服务</span><br>sudo service mysql restart<br><br></code></pre></td></tr></table></figure><p>如果远程连接提示“100061”错误,那就继续修改/etc/mysql/mariadb.conf.d文件夹中的50-server.cnf文件</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs sh"><span class="hljs-comment">#用nano打开50-server.cnf</span><br>sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf<br><br><span class="hljs-comment">#修改其中的bind-address为</span><br>bind-address = 0.0.0.0<br><br><span class="hljs-comment">#Ctrl + O 保存再 Ctrl + X 退出,并重启mysql服务即可生效。</span><br>sudo service mysql restart<br><br></code></pre></td></tr></table></figure><h2 id="五、安装PhpMyAdmin"><a href="#五、安装PhpMyAdmin" class="headerlink" title="五、安装PhpMyAdmin"></a>五、安装PhpMyAdmin</h2><p>1.要将PHPMyAdmin软件包安装到树莓派中,需要运行以下命令。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo apt install phpmyadmin<br></code></pre></td></tr></table></figure><p>2.PHPMyAdmin现在将开始安装到树莓派。在此过程中,系统将会询问你已经运行的Web服务器类型。</p><p>我这里使用的是nginx,所以点击Esc退出,你可以根据自己的情况选择</p><p>安装完毕后,再把phpmyadmin链接到/var/www/html目录下</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">sudo <span class="hljs-built_in">ln</span> -s /usr/share/phpmyadmin /var/www/html<br></code></pre></td></tr></table></figure><p>浏览器打开 http:// 树莓派ip/phpmyadmin 就可以用root和新密码登录管理mysql数据库了!!</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210409232831.png" alt="image-20210409232830987"></p><p>好了,到这里就差不多结束了,遇到问题要多使用搜索引擎搜索哦!不要放弃,慢慢来。</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>树莓派</tag>
<tag>玩客云</tag>
<tag>Nginx</tag>
<tag>PHP</tag>
<tag>MySQL</tag>
<tag>PhpMyAdmin</tag>
</tags>
</entry>
<entry>
<title>在玩客云或树莓派上通过ffmpeg将视频推流到直播平台</title>
<link href="/2021/04/09/%E5%9C%A8%E7%8E%A9%E5%AE%A2%E4%BA%91%E6%88%96%E6%A0%91%E8%8E%93%E6%B4%BE%E4%B8%8A%E9%80%9A%E8%BF%87ffmpeg%E5%B0%86%E8%A7%86%E9%A2%91%E6%8E%A8%E6%B5%81%E5%88%B0%E7%9B%B4%E6%92%AD%E5%B9%B3%E5%8F%B0/"/>
<url>/2021/04/09/%E5%9C%A8%E7%8E%A9%E5%AE%A2%E4%BA%91%E6%88%96%E6%A0%91%E8%8E%93%E6%B4%BE%E4%B8%8A%E9%80%9A%E8%BF%87ffmpeg%E5%B0%86%E8%A7%86%E9%A2%91%E6%8E%A8%E6%B5%81%E5%88%B0%E7%9B%B4%E6%92%AD%E5%B9%B3%E5%8F%B0/</url>
<content type="html"><![CDATA[<p>为了压榨玩客云的性能,搞了直播推流,下面教大家怎么推流</p><p>我把玩客云刷了Powersee的玩客云第二版固件,具体看<a href="https://powersee.gitee.io/2021/02/wankeyun-2/">这里</a>,当然使用树莓派也可以</p><h2 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h2><h4 id="1、安装ffmpeg"><a href="#1、安装ffmpeg" class="headerlink" title="1、安装ffmpeg"></a>1、安装ffmpeg</h4><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">sudo apt-<span class="hljs-built_in">get</span> install ffmpeg<br></code></pre></td></tr></table></figure><h4 id="2、启动推流"><a href="#2、启动推流" class="headerlink" title="2、启动推流"></a>2、启动推流</h4><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stylus">ffmpeg -re -<span class="hljs-selector-tag">i</span> /root/<span class="hljs-selector-tag">video</span><span class="hljs-selector-class">.mp4</span> -vcodec libx264 -acodec aac -strict -<span class="hljs-number">2</span> -f flv <span class="hljs-string">"你的推流地址"</span><br></code></pre></td></tr></table></figure><p>举个栗子(B站):</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">ffmpeg -re -i <span class="hljs-regexp">/mnt/</span>aria2-downloads<span class="hljs-regexp">/xianghuo.mkv -vcodec libx264 -acodec aac -strict -2 -f flv "rtmp:/</span><span class="hljs-regexp">/live-push.bilivideo.com/</span>live-bvc/直播码<span class="hljs-string">"</span><br></code></pre></td></tr></table></figure><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210409224001.png" alt="image-20210409224001344"></p><p>更多详细说明可参考ffmpeg官方文档:<a href="http://ffmpeg.org/ffmpeg.html">http://ffmpeg.org/ffmpeg.html</a></p><h4 id="3、后台执行"><a href="#3、后台执行" class="headerlink" title="3、后台执行"></a>3、后台执行</h4><p>(1)安装screen</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">sudo apt-<span class="hljs-built_in">get</span> install screen<br></code></pre></td></tr></table></figure><p>(2)新建终端</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">screen -S live</span><br></code></pre></td></tr></table></figure><p>(3)在新的终端执行命令后</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">Ctrl+<span class="hljs-selector-tag">A</span>+D<br></code></pre></td></tr></table></figure><p>(4)重新进入终端</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">screen -r live</span><br></code></pre></td></tr></table></figure><p>(5)删除某一个终端</p><figure class="highlight cos"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cos">screen -<span class="hljs-keyword">S</span> 进程号 -<span class="hljs-keyword">X</span> <span class="hljs-keyword">quit</span><br></code></pre></td></tr></table></figure><h4 id="4-推流成功"><a href="#4-推流成功" class="headerlink" title="4.推流成功"></a>4.推流成功</h4><p><a href="https://live.bilibili.com/21577989">https://live.bilibili.com/21577989</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210409224250.png" alt="image-20210409224250405"></p><p>玩客云直播时的参数</p><p>CPU基本跑满</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210409224355.png" alt="image-20210409224355158"></p><p>好了,赶快去实践吧!</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>树莓派</tag>
<tag>玩客云</tag>
<tag>ffmpeg</tag>
</tags>
</entry>
<entry>
<title>阿里云盘+OneManager+Heroku+CFWorkers实现阿里云盘网络挂载</title>
<link href="/2021/03/28/%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98-OneManager-Heroku-CFWorkers%E5%AE%9E%E7%8E%B0%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98%E7%BD%91%E7%BB%9C%E6%8C%82%E8%BD%BD/"/>
<url>/2021/03/28/%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98-OneManager-Heroku-CFWorkers%E5%AE%9E%E7%8E%B0%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98%E7%BD%91%E7%BB%9C%E6%8C%82%E8%BD%BD/</url>
<content type="html"><![CDATA[<p>你是不是想和我一样把阿里云盘搭建成一个分享平台呢?像下面这样</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328182903.png" alt="image-20210328182902788"></p><p>实现直链下载,不通过客户端,还可以分享给别人</p><p>我们先来看看实现的方法</p><p>下面有两种挂载程序(任选其一)</p><p>1.Onemanager</p><p><a href="https://github.com/qkqpttgf/OneManager-php">https://github.com/qkqpttgf/OneManager-php</a></p><p>2.ShareList</p><p><a href="https://github.com/reruin/sharelist">https://github.com/reruin/sharelist</a></p><p>部署方式有许多种,我们这里采用Heroku部署(要白嫖嘛~)</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul><li>阿里云盘账户</li><li>Heroku账户</li><li>GitHub 项目地址</li></ul><h2 id="搭建步骤"><a href="#搭建步骤" class="headerlink" title="搭建步骤"></a>搭建步骤</h2><p>我们先来讲Onemanager</p><p>首先注册一个Heroku账号(可能需要科学上网)</p><p><a href="https://signup.heroku.com/login">https://signup.heroku.com/login</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328184128.png" alt="image-20210328184128510"></p><p>这个不用教了吧~</p><p>注册好后登陆,打开Onemanager的github项目</p><p><a href="https://github.com/qkqpttgf/OneManager-php">https://github.com/qkqpttgf/OneManager-php</a></p><p>点击“<strong>Deploy to Heroku</strong>”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328184305.png" alt="image-20210328184305549"></p><p>App name 随便填一个,下面选择美国或欧洲,然后点击“Deploy app”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328184431.png" alt="image-20210328184431355"></p><p>然后等它构建完成,点击“<strong>View</strong>”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328184659.png" alt="image-20210328184659731"></p><p>点击“点击开始安装程序”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328184754.png" alt="image-20210328184754371"></p><p>语言选择中文,然后点击新建API Key</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328184844.png" alt="image-20210328184844603"></p><p>然后滑到下边找到<strong>API Key</strong>点击<strong>Reveal</strong>,复制key</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328184957.png" alt="image-20210328184956986"></p><p>然后返回刚才的页面,粘贴key并设置管理密码</p><p>之后会进入这个页面,点击“登陆”,输入你刚才设置的密码</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328185252.png" alt="image-20210328185252740"></p><p>然后点击“管理-设置”,然后在添加盘那里选择“Aliyundrive”,然后点击“添加盘”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328185440.png" alt="image-20210328185440480"></p><p>这个随便填一下</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328185616.png" alt="image-20210328185616863"></p><p>然后点击“确认”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328185658.png" alt="image-20210328185658487"></p><p>接下来我们获取refresh_token</p><p>首先登陆阿里云盘</p><p><a href="https://www.aliyundrive.com/drive">https://www.aliyundrive.com/drive</a></p><p>登陆阿里云盘之后,打开开发者工具,切换到<code>Application</code>选项卡,点开<code>Local storage</code>,会有一个<code>token</code>项,点开就可以看到<code>refresh_token</code>了</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328185933.png"></p><p>复制粘贴到刚才的页面,选择下面的其中之一</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328190144.png" alt="image-20210328190144678"></p><p>这样就搭建好了,你可以在设置里美化页面,设置参数</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328190233.png" alt="image-20210328190232979"></p><p>接下来我们讲ShareList</p><p>还是注册登陆好 <strong>Heroku</strong></p><p>打开<a href="https://github.com/reruin/sharelist%EF%BC%8C%E7%82%B9%E5%87%BB%E2%80%9C%E6%9F%A5%E7%9C%8B%E6%96%87%E6%A1%A3%E2%80%9D">https://github.com/reruin/sharelist,点击“查看文档”</a></p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328190652.png" alt="image-20210328190652385"></p><p>点击“<strong>Deploy toHeroku</strong>”</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328190832.png" alt="image-20210328190832463"></p><p>名字name随便起,json地址 </p><p> <a href="https://raw.githubusercontent.com/reruin/sharelist/master/package.json">https://raw.githubusercontent.com/reruin/sharelist/master/package.json</a></p><p>点击Deploy app,开始创建</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328190956.png" alt="image-20210328190956545"></p><p>创建成功,点击“View“</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328191604.png" alt="image-20210328191604095"></p><p>进行初始化</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328191803.png" alt="image-20210328191802983"></p><p>要求按下面这个,虚拟路径那里选择“AliyunDrive”,然后点击保存</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328191705.png" alt="image-20210328191705132"></p><p>下一步填入refresh_token,方法还是上面那个</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328192122.png" alt="image-20210328192122118"></p><p>好了,这样就搭建好了。为了更好的访问速度可以进行CF Workers部署</p><h2 id="CF-Workers部署"><a href="#CF-Workers部署" class="headerlink" title="CF Workers部署"></a>CF Workers部署</h2><p>打开</p><p><a href="https://dash.cloudflare.com/">https://dash.cloudflare.com/</a></p><p>1.进入cf workers后台,选择新建worker</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328192858.png" alt="image-20210328192858698"></p><p>2.复制如下代码,到worker编辑器中(xxxx.herokuapp.com改成你自己的)</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br></pre></td><td class="code"><pre><code class="hljs csharp"><span class="hljs-comment">// 替换成你想镜像的站点</span><br><span class="hljs-keyword">const</span> upstream = <span class="hljs-string">'xxxx.herokuapp.com'</span><br> <br><span class="hljs-comment">// 如果那个站点有专门的移动适配站点,否则保持和上面一致</span><br><span class="hljs-keyword">const</span> upstream_mobile = <span class="hljs-string">'xxxx.herokuapp.com'</span><br> <br><span class="hljs-comment">// 你希望禁止哪些国家访问</span><br><span class="hljs-keyword">const</span> blocked_region = [<span class="hljs-string">'KP'</span>]<br> <br><span class="hljs-comment">// 禁止自访问</span><br><span class="hljs-keyword">const</span> blocked_ip_address = [<span class="hljs-string">'0.0.0.0'</span>, <span class="hljs-string">'127.0.0.1'</span>]<br> <br><span class="hljs-comment">// 替换成你想镜像的站点</span><br><span class="hljs-keyword">const</span> replace_dict = {<br> <span class="hljs-string">'$upstream'</span>: <span class="hljs-string">'$custom_domain'</span>,<br> <span class="hljs-string">'//google.com'</span>: <span class="hljs-string">''</span><br>}<br> <br><span class="hljs-comment">//以下内容都不用动</span><br>addEventListener(<span class="hljs-string">'fetch'</span>, <span class="hljs-keyword">event</span> => {<br> <span class="hljs-keyword">event</span>.respondWith(fetchAndApply(<span class="hljs-keyword">event</span>.request));<br>})<br> <br><span class="hljs-function"><span class="hljs-keyword">async</span> function <span class="hljs-title">fetchAndApply</span>(<span class="hljs-params">request</span>)</span> {<br> <br> <span class="hljs-keyword">const</span> region = request.headers.<span class="hljs-keyword">get</span>(<span class="hljs-string">'cf-ipcountry'</span>).toUpperCase();<br> <span class="hljs-keyword">const</span> ip_address = request.headers.<span class="hljs-keyword">get</span>(<span class="hljs-string">'cf-connecting-ip'</span>);<br> <span class="hljs-keyword">const</span> user_agent = request.headers.<span class="hljs-keyword">get</span>(<span class="hljs-string">'user-agent'</span>);<br> <br> <span class="hljs-keyword">let</span> response = <span class="hljs-literal">null</span>;<br> <span class="hljs-keyword">let</span> url = <span class="hljs-keyword">new</span> URL(request.url);<br> <span class="hljs-keyword">let</span> url_host = url.host;<br> <br> <span class="hljs-keyword">if</span> (url.protocol == <span class="hljs-string">'http:'</span>) {<br> url.protocol = <span class="hljs-string">'https:'</span><br> response = Response.redirect(url.href);<br> <span class="hljs-keyword">return</span> response;<br> }<br> <br> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">await</span> device_status(user_agent)) {<br> upstream_domain = upstream<br> } <span class="hljs-keyword">else</span> {<br> upstream_domain = upstream_mobile<br> }<br> <br> url.host = upstream_domain;<br> <br> <span class="hljs-keyword">if</span> (blocked_region.includes(region)) {<br> response = <span class="hljs-keyword">new</span> Response(<span class="hljs-string">'Access denied: WorkersProxy is not available in your region yet.'</span>, {<br> status: <span class="hljs-number">403</span><br> });<br> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(blocked_ip_address.includes(ip_address)){<br> response = <span class="hljs-keyword">new</span> Response(<span class="hljs-string">'Access denied: Your IP address is blocked by WorkersProxy.'</span>, {<br> status: <span class="hljs-number">403</span><br> });<br> } <span class="hljs-keyword">else</span>{<br> <span class="hljs-keyword">let</span> method = request.method;<br> <span class="hljs-keyword">let</span> request_headers = request.headers;<br> <span class="hljs-keyword">let</span> new_request_headers = <span class="hljs-keyword">new</span> Headers(request_headers);<br> <br> new_request_headers.<span class="hljs-keyword">set</span>(<span class="hljs-string">'Host'</span>, upstream_domain);<br> new_request_headers.<span class="hljs-keyword">set</span>(<span class="hljs-string">'Referer'</span>, url.href);<br> <br> <span class="hljs-keyword">let</span> original_response = <span class="hljs-keyword">await</span> fetch(url.href, {<br> method: method,<br> headers: new_request_headers<br> })<br> <br> <span class="hljs-keyword">let</span> original_response_clone = original_response.clone();<br> <span class="hljs-keyword">let</span> original_text = <span class="hljs-literal">null</span>;<br> <span class="hljs-keyword">let</span> response_headers = original_response.headers;<br> <span class="hljs-keyword">let</span> new_response_headers = <span class="hljs-keyword">new</span> Headers(response_headers);<br> <span class="hljs-keyword">let</span> status = original_response.status;<br> <br> new_response_headers.<span class="hljs-keyword">set</span>(<span class="hljs-string">'access-control-allow-origin'</span>, <span class="hljs-string">'*'</span>);<br> new_response_headers.<span class="hljs-keyword">set</span>(<span class="hljs-string">'access-control-allow-credentials'</span>, <span class="hljs-literal">true</span>);<br> new_response_headers.delete(<span class="hljs-string">'content-security-policy'</span>);<br> new_response_headers.delete(<span class="hljs-string">'content-security-policy-report-only'</span>);<br> new_response_headers.delete(<span class="hljs-string">'clear-site-data'</span>);<br> <br> <span class="hljs-keyword">const</span> content_type = new_response_headers.<span class="hljs-keyword">get</span>(<span class="hljs-string">'content-type'</span>);<br> <span class="hljs-keyword">if</span> (content_type.includes(<span class="hljs-string">'text/html'</span>) && content_type.includes(<span class="hljs-string">'UTF-8'</span>)) {<br> original_text = <span class="hljs-keyword">await</span> replace_response_text(original_response_clone, upstream_domain, url_host);<br> } <span class="hljs-keyword">else</span> {<br> original_text = original_response_clone.body<br> }<br> <br> response = <span class="hljs-keyword">new</span> Response(original_text, {<br> status,<br> headers: new_response_headers<br> })<br> }<br> <span class="hljs-keyword">return</span> response;<br>}<br> <br><span class="hljs-function"><span class="hljs-keyword">async</span> function <span class="hljs-title">replace_response_text</span>(<span class="hljs-params">response, upstream_domain, host_name</span>)</span> {<br> <span class="hljs-keyword">let</span> text = <span class="hljs-keyword">await</span> response.text()<br> <br> <span class="hljs-keyword">var</span> i, j;<br> <span class="hljs-keyword">for</span> (i <span class="hljs-keyword">in</span> replace_dict) {<br> j = replace_dict[i]<br> <span class="hljs-keyword">if</span> (i == <span class="hljs-string">'$upstream'</span>) {<br> i = upstream_domain<br> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (i == <span class="hljs-string">'$custom_domain'</span>) {<br> i = host_name<br> }<br> <br> <span class="hljs-keyword">if</span> (j == <span class="hljs-string">'$upstream'</span>) {<br> j = upstream_domain<br> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (j == <span class="hljs-string">'$custom_domain'</span>) {<br> j = host_name<br> }<br> <br> <span class="hljs-keyword">let</span> re = <span class="hljs-keyword">new</span> RegExp(i, <span class="hljs-string">'g'</span>)<br> text = text.replace(re, j);<br> }<br> <span class="hljs-keyword">return</span> text;<br>}<br> <br><span class="hljs-function"><span class="hljs-keyword">async</span> function <span class="hljs-title">device_status</span> (<span class="hljs-params">user_agent_info</span>)</span> {<br> <span class="hljs-keyword">var</span> agents = [<span class="hljs-string">"Android"</span>, <span class="hljs-string">"iPhone"</span>, <span class="hljs-string">"SymbianOS"</span>, <span class="hljs-string">"Windows Phone"</span>, <span class="hljs-string">"iPad"</span>, <span class="hljs-string">"iPod"</span>];<br> <span class="hljs-keyword">var</span> flag = <span class="hljs-literal">true</span>;<br> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> v = <span class="hljs-number">0</span>; v < agents.length; v++) {<br> <span class="hljs-keyword">if</span> (user_agent_info.indexOf(agents[v]) > <span class="hljs-number">0</span>) {<br> flag = <span class="hljs-literal">false</span>;<br> <span class="hljs-keyword">break</span>;<br> }<br> }<br> <span class="hljs-keyword">return</span> flag;<br>}<br></code></pre></td></tr></table></figure><p>然后点击“保存并部署“,然后你可以改一个你喜欢的名称</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210328193133.png" alt="image-20210328193133570"></p><p>自定义域名可以参考这篇文章</p><p><a href="https://vircloud.net/exp/cf-worker-domain.html">https://vircloud.net/exp/cf-worker-domain.html</a></p><p>演示站点</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">https:<span class="hljs-regexp">//</span>huangepan.hgnet.workers.dev/<br></code></pre></td></tr></table></figure><p>好了,快去实践吧!</p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>阿里云盘</tag>
<tag>OneManager</tag>
</tags>
</entry>
<entry>
<title>GiWiFI校园网认证过程分析与模拟登录</title>
<link href="/2021/03/22/GiWiFI%E6%A0%A1%E5%9B%AD%E7%BD%91%E8%AE%A4%E8%AF%81%E8%BF%87%E7%A8%8B%E5%88%86%E6%9E%90%E4%B8%8E%E6%A8%A1%E6%8B%9F%E7%99%BB%E5%BD%95/"/>
<url>/2021/03/22/GiWiFI%E6%A0%A1%E5%9B%AD%E7%BD%91%E8%AE%A4%E8%AF%81%E8%BF%87%E7%A8%8B%E5%88%86%E6%9E%90%E4%B8%8E%E6%A8%A1%E6%8B%9F%E7%99%BB%E5%BD%95/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>GiWiFi是由上海寰创网络科技有限公司基于<a href="http://www.wifidog.org/">wifidog</a>项目开发的一套网关管理系统, 通常被应用于校园网行业.</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210322234723.png" alt="img"></p><h1 id="认证机制"><a href="#认证机制" class="headerlink" title="认证机制"></a>认证机制</h1><p>由于GiWiFi是基于wifidog项目的, 所以大致流程也差不多</p><h2 id="基本流程"><a href="#基本流程" class="headerlink" title="基本流程"></a>基本流程</h2><h3 id="用户上线"><a href="#用户上线" class="headerlink" title="用户上线"></a>用户上线</h3><ol><li>用户访问网络,通过iptables将未认证的用户dnat到wifidog进程,wifidog通过307报文将用户重定向到认证服务器</li><li>用户打开认证服务器登录页面,输入用户名密码,发送认证请求</li><li>认证成功的话服务器会发送302报文,携带token信息重定向到wifidog页面。认证失败的话会返回失败页面</li><li>用户携带token信息向wifidog发起认证请求,wifidog再向认证服务器发起请求,认证成功后授权,并将用户重定向到成功页面</li></ol><h3 id="保活和下线"><a href="#保活和下线" class="headerlink" title="保活和下线"></a>保活和下线</h3><ol><li>wifidog会定时向认证服务器发送保活消息(相当于<strong>心跳</strong>)</li><li>当用户主动请求下线后,wifidog此时并没有下线</li><li>当wifidog再次发起保活请求时,认证服务器会告诉它用户已下线,此时wifidog会将用户下线</li></ol><h1 id="网页登录"><a href="#网页登录" class="headerlink" title="网页登录"></a>网页登录</h1><p>客户端引导下载页对于不同的设备和系统使用了UA进行区分,经过测试,提供的客户端有Windows、macOS、iOS以及Android版本(果然Linux又被忽视了,显示的是Android版的下载按钮🌝)</p><p>由于对此类认证客户端的排斥和心理洁癖,我便开始寻找使用网页认证,甚至是使用脚本模拟认证的方法,果不其然,经过一番分析与搜寻,我找到了一些东西</p><h4 id="你藏得好深啊,登录框"><a href="#你藏得好深啊,登录框" class="headerlink" title="你藏得好深啊,登录框"></a>你藏得好深啊,登录框</h4><p>此前网页的认证过程为</p><ol><li>打开任意http页面后被劫持至<code>172.17.1.1:8062/redirect</code></li><li>返回307跳转至认证页</li><li>在认证页里输入账号密码登录认证</li><li>关闭认证页,一段时间内即可正常上网</li></ol><p>而现在跳转后仅显示客户端的下载按钮,直觉意识到这是一个专用于客户端引导下载的页面,真正的认证页仍另藏他处</p><p>事实正是如此,对比历史记录,现在的跳转页面的域名是<code>172.17.1.1</code>(校园网网关IP),此前的认证页则是<code>http://login.gwifi.com.cn/cmps/admin.php/api/login/</code></p><h2 id="修改UA"><a href="#修改UA" class="headerlink" title="修改UA"></a>修改UA</h2><p>先修改UA为ipad(使用UA浏览器插件即可,或者浏览器里的自定义UA)</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">Mozilla</span>/<span class="hljs-number">5</span>.<span class="hljs-number">0</span> (iPad; CPU OS <span class="hljs-number">6</span>_0 like Mac OS X) AppleWebKit/<span class="hljs-number">536</span>.<span class="hljs-number">26</span> (KHTML, like Gecko) Version/<span class="hljs-number">6</span>.<span class="hljs-number">0</span> Mobile/<span class="hljs-number">10</span>A5376e Safari/<span class="hljs-number">8536</span>.<span class="hljs-number">25</span><br></code></pre></td></tr></table></figure><p>将客户端引导下载页的URL参数粘贴到认证页的URL后并打开,就能看到之前的认证页了(单纯打开首页会显示It works! ,不加任何参数打开的话则是跳转至新浪首页,阿巴阿巴~)</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">http:<span class="hljs-regexp">//</span>login.gwifi.com.cn<span class="hljs-regexp">/cmps/</span>admin.php<span class="hljs-regexp">/api/</span>login/?gw_address=<span class="hljs-number">172.17</span>.<span class="hljs-number">1.1</span>&gw_port=<span class="hljs-number">8060</span>&gw_id=GWIFI-zhongbeixinshang01&ip=<span class="hljs-number">10.16</span>.<span class="hljs-number">100.174</span>&mac=你的MAC地址<br></code></pre></td></tr></table></figure><p>认证页打开之后仍是一个大大的客户端下载按钮,但不要慌。打开审查元素就会发现,所有的登录框、重设密码框、注册框等都在,只是被隐藏掉了</p><p>去掉隐藏样式,正常输入账号密码登录即可,和之前的操作一模一样(登录后会跳转至百度首页,看来这两个页面是同一位鬼才写的🌝)</p><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210322234856.png" alt="image-20210322234856216"></p><h2 id="登录接口及参数分析"><a href="#登录接口及参数分析" class="headerlink" title="登录接口及参数分析"></a>登录接口及参数分析</h2><p>找到了登录框之后,就可以开始分析接口和参数了</p><p>直接看页面代码吧,写的挺乱的,好在未经过混淆,关键部分:</p><h3 id="登录接口"><a href="#登录接口" class="headerlink" title="登录接口"></a>登录接口</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">var</span> loginAction = <span class="hljs-keyword">function</span>(<span class="hljs-params">params</span>){<br> <span class="hljs-keyword">var</span> btn = $(<span class="hljs-string">"#first_button"</span>);<br> <span class="hljs-keyword">var</span> round = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">round</span>(<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">random</span>()*<span class="hljs-number">1000</span>);<br> <span class="hljs-keyword">var</span> form = $(<span class="hljs-string">"#frmLogin"</span>);<br> $.<span class="hljs-title function_">ajax</span>({<br> <span class="hljs-attr">url</span>: <span class="hljs-string">"/cmps/admin.php/api/loginaction?round="</span>+round,<br> <span class="hljs-attr">data</span>: form.<span class="hljs-title function_">serialize</span>(),<br> <span class="hljs-attr">type</span>: <span class="hljs-string">"post"</span>,<br> <span class="hljs-attr">async</span>: <span class="hljs-literal">false</span>,<br> <span class="hljs-attr">dataType</span>: <span class="hljs-string">"json"</span>,<br> <span class="hljs-attr">success</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params">data</span>) {<br> <span class="hljs-keyword">if</span> (data.<span class="hljs-property">status</span> === <span class="hljs-number">1</span>) {<br> <span class="hljs-keyword">if</span>(data.<span class="hljs-property">data</span>.<span class="hljs-property">reasoncode</span> == <span class="hljs-string">"44"</span>){<br> params = <span class="hljs-title function_">getWechatParams</span>(data);<br> <span class="hljs-comment">//showSelectMessage(params);</span><br> <span class="hljs-title function_">wechatAuth</span>(params.<span class="hljs-property">okParams</span>);<br> }<span class="hljs-keyword">else</span>{<br> <span class="hljs-variable language_">window</span>.<span class="hljs-property">location</span>.<span class="hljs-property">href</span> = data.<span class="hljs-property">info</span>;<br> }<br> } <span class="hljs-keyword">else</span> {<br> btn.<span class="hljs-title function_">removeAttr</span>(<span class="hljs-string">'disabled'</span>);<br> <span class="hljs-title function_">doFailedLogin</span>(data,<span class="hljs-string">"frmLogin"</span>);<br> <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;<br> }<br> }<br> });<br>}<br></code></pre></td></tr></table></figure><p>可以看到接口为<code>/cmps/admin.php/api/loginaction</code>,参数都在登录表单里:</p><p><em>关键部分已手动打码</em></p><table><thead><tr><th>参数名</th><th>值</th><th>说明</th></tr></thead><tbody><tr><td>access_type</td><td>2</td><td>作用未知</td></tr><tr><td>acsign</td><td>***</td><td>登录状态接口中的sign字段</td></tr><tr><td>btype</td><td>pc</td><td>猜测为平台类型</td></tr><tr><td>client_mac</td><td>***</td><td>客户端MAC</td></tr><tr><td>contact_phone</td><td>400-038-5858</td><td>服务电话</td></tr><tr><td>devicemode</td><td></td><td>默认空值,作用未知</td></tr><tr><td>gw_address</td><td>172.17.1.1</td><td>网关地址</td></tr><tr><td>gw_id</td><td>***</td><td>AP的SSID</td></tr><tr><td>gw_port</td><td>8060</td><td>网关端口</td></tr><tr><td>lastaccessurl</td><td></td><td>默认空值,作用未知</td></tr><tr><td>logout_reason</td><td>0</td><td>作用未知</td></tr><tr><td>mac</td><td>***</td><td>同client_mac</td></tr><tr><td>name</td><td>***</td><td>账号</td></tr><tr><td>online_time</td><td>0</td><td>猜测为在线时间,作用未知</td></tr><tr><td>page_time</td><td>1535509645</td><td>登录页时间戳</td></tr><tr><td>password</td><td>***</td><td>密码</td></tr><tr><td>sign</td><td>***</td><td>签名,可从登录表单中获取</td></tr><tr><td>station_cloud</td><td>login.gwifi.com.cn</td><td>作用未知</td></tr><tr><td>station_sn</td><td>***</td><td>猜测为基站ID</td></tr><tr><td>suggest_phone</td><td>400-038-5858</td><td>同contact_phone</td></tr><tr><td>url</td><td><a href="http://www.baidu.com/">http://www.baidu.com</a></td><td>登录成功后跳转的网站</td></tr><tr><td>user_agent</td><td></td><td>默认空值,作用未知</td></tr></tbody></table><p>观察后发现登录所需的大部分参数在认证页的URL参数里已经有了,剩下的有一部分已经在登录表单里填好了,另一部分需要从下文的登录状态接口中取到,将其组合起来后发送POST请求</p><p>登录成功后返回JSON数据:</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs json"><span class="hljs-punctuation">{</span><br> <span class="hljs-attr">"status"</span><span class="hljs-punctuation">:</span><span class="hljs-number">1</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"info"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"http://172.17.1.1:8060/wifidog/auth?token=***&info=***"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span><span class="hljs-punctuation">{</span><br> <span class="hljs-attr">"auth_verify"</span><span class="hljs-punctuation">:</span><span class="hljs-number">1</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"reasoncode"</span><span class="hljs-punctuation">:</span><span class="hljs-number">0</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"remain_time"</span><span class="hljs-punctuation">:</span><span class="hljs-number">1053640</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"limit_time"</span><span class="hljs-punctuation">:</span><span class="hljs-keyword">null</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"cost_type"</span><span class="hljs-punctuation">:</span><span class="hljs-number">4</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"serviceplan_id"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"1357"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"is_share"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"2"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"wechat_enable"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"1"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"bw_up"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"2048"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"bw_down"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"10240"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"ontrial"</span><span class="hljs-punctuation">:</span><span class="hljs-number">0</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"need_complete_data"</span><span class="hljs-punctuation">:</span><span class="hljs-keyword">null</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"complete_data_url"</span><span class="hljs-punctuation">:</span><span class="hljs-keyword">null</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"permit_intranet"</span><span class="hljs-punctuation">:</span><span class="hljs-number">2</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"permit_internet"</span><span class="hljs-punctuation">:</span><span class="hljs-number">2</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"carrier_operator"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"3"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"network_type"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"2"</span><br> <span class="hljs-punctuation">}</span><br><span class="hljs-punctuation">}</span><br></code></pre></td></tr></table></figure><p>其中的<code>info</code>字段的URL用作登录验证,使用GET请求就可以完成整个认证登录的流程了</p><p>登录失败的话<code>info</code>字段则会返回百度首页的URL,再次吐槽一下🌝</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs json"><span class="hljs-punctuation">{</span><br> <span class="hljs-attr">"status"</span><span class="hljs-punctuation">:</span><span class="hljs-number">1</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"info"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"http:\/\/www.baidu.com"</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span><span class="hljs-number">1</span><br><span class="hljs-punctuation">}</span><br></code></pre></td></tr></table></figure><h3 id="登录状态接口"><a href="#登录状态接口" class="headerlink" title="登录状态接口"></a>登录状态接口</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">initData</span>(<span class="hljs-params"></span>){<br> <span class="hljs-comment">//获取终端信息</span><br> $.<span class="hljs-title function_">ajax</span>({<br> <span class="hljs-attr">url</span>: <span class="hljs-string">"http://172.17.1.1:8060/wifidog/get_auth_state?ip=***&mac=***&sign=***&callback=***"</span>,<br> <span class="hljs-attr">dataType</span>:<span class="hljs-string">'jsonp'</span>,<br> <span class="hljs-attr">success</span>: <span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>) {<br> c = <span class="hljs-built_in">eval</span>(<span class="hljs-string">'('</span> + data.<span class="hljs-property">data</span> + <span class="hljs-string">')'</span>);<br> <span class="hljs-keyword">if</span>(data.<span class="hljs-property">resultCode</span> == <span class="hljs-number">0</span>){<br> <span class="hljs-title function_">fixData</span>(c);<br> }<span class="hljs-keyword">else</span> {<br> <span class="hljs-variable language_">window</span>.<span class="hljs-property">top</span>.<span class="hljs-property">location</span>.<span class="hljs-property">href</span> = <span class="hljs-string">"http://www.baidu.com"</span>;<br> }<br> <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;<br> },<br> <span class="hljs-attr">error</span>:<span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>) {<br> <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;<br> },<br> <span class="hljs-attr">cache</span>: <span class="hljs-literal">false</span><br> });<br>}<br></code></pre></td></tr></table></figure><p>同样可以看到接口为<code>/wifidog/get_auth_state</code>,参数为IP、MAC、签名和回调函数名,其中的签名可以直接在页面表单里取到</p><p>返回结果为JSONP数据,提取为:</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs json"><span class="hljs-punctuation">{</span><br> <span class="hljs-attr">"resultCode"</span><span class="hljs-punctuation">:</span><span class="hljs-number">0</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span><span class="hljs-string">"{"</span>auth_state<span class="hljs-string">":2,"</span>gw_id<span class="hljs-string">":"</span>***<span class="hljs-string">","</span>access_type<span class="hljs-string">":"</span><span class="hljs-number">2</span><span class="hljs-string">","</span>authStaType<span class="hljs-string">":"</span><span class="hljs-number">0</span><span class="hljs-string">","</span>station_sn<span class="hljs-string">":"</span>***<span class="hljs-string">","</span>client_mac<span class="hljs-string">":"</span>***<span class="hljs-string">","</span>online_time<span class="hljs-string">":11,"</span>logout_reason<span class="hljs-string">":7,"</span>contact_phone<span class="hljs-string">":"</span><span class="hljs-number">400</span><span class="hljs-number">-038</span><span class="hljs-number">-5858</span><span class="hljs-string">","</span>suggest_phone<span class="hljs-string">":"</span><span class="hljs-number">400</span><span class="hljs-number">-038</span><span class="hljs-number">-5858</span><span class="hljs-string">","</span>station_cloud<span class="hljs-string">":"</span>login.gwifi.com.cn<span class="hljs-string">","</span>orgId<span class="hljs-string">":"</span><span class="hljs-number">899</span><span class="hljs-string">","</span>sign<span class="hljs-string">":"</span>***<span class="hljs-string">"}"</span><br><span class="hljs-punctuation">}</span><br></code></pre></td></tr></table></figure><p>其中的<code>auth_state</code>字段值为<code>2</code>时为正常登录状态</p><p>观察登录成功后执行的操作,是替换了部分表单数据:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">fixData</span>(<span class="hljs-params">data</span>) {<br> $(<span class="hljs-string">".gw_id"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">gw_id</span>);<br> $(<span class="hljs-string">".access_type"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">access_type</span>);<br> $(<span class="hljs-string">".station_sn"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">station_sn</span>);<br> $(<span class="hljs-string">".client_mac"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">client_mac</span>);<br> $(<span class="hljs-string">".online_time"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">online_time</span>);<br> $(<span class="hljs-string">".logout_reason"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">logout_reason</span>);<br> $(<span class="hljs-string">".contact_phone"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">contact_phone</span>);<br> $(<span class="hljs-string">".suggest_phone"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">suggest_phone</span>);<br> $(<span class="hljs-string">".station_cloud"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">station_cloud</span>);<br> $(<span class="hljs-string">".acsign"</span>).<span class="hljs-title function_">val</span>(data.<span class="hljs-property">sign</span>);<br>}<br></code></pre></td></tr></table></figure><p>进行模拟登录时也应一一替换</p><p><em>需要注意的是参数<code>callback</code>是必需的,不然将不会返回<code>sign</code>字段值</em></p><h3 id="登出接口"><a href="#登出接口" class="headerlink" title="登出接口"></a>登出接口</h3><p>登出功能在客户端引导下载页上,接口及参数为<code>http://172.17.1.1/getApp.htm?action=logout</code></p><p>返回数据为:</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs json"><span class="hljs-punctuation">{</span><br> <span class="hljs-attr">"resultCode"</span><span class="hljs-punctuation">:</span><span class="hljs-number">0</span><span class="hljs-punctuation">,</span><br> <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span><span class="hljs-punctuation">[</span><span class="hljs-punctuation">]</span><br><span class="hljs-punctuation">}</span><br></code></pre></td></tr></table></figure><p>其中<code>resultCode</code>字段值为<code>0</code>时登出成功</p><h2 id="模拟登录脚本"><a href="#模拟登录脚本" class="headerlink" title="模拟登录脚本"></a>模拟登录脚本</h2><p>现在登录相关接口和所需参数已经了解,可以开始写模拟登录了</p><p>这里使用Python来实现,理论上对所有GiWiFi系统通用</p><p>这里需要事先安装好Python以及requests、netifaces库</p><p>你可能会用到<a href="https://huangenet.lanzous.com/iMFn0n7nnvc">Visualcppbuildtools</a>(安装C++插件)</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span><br><span class="hljs-keyword">import</span> os<br><span class="hljs-keyword">import</span> re<br><span class="hljs-keyword">import</span> time<br><span class="hljs-keyword">import</span> json<br><span class="hljs-keyword">import</span> argparse<br><span class="hljs-keyword">import</span> requests<br><span class="hljs-keyword">import</span> netifaces<br><span class="hljs-keyword">from</span> getpass <span class="hljs-keyword">import</span> getpass<br><span class="hljs-keyword">from</span> urllib.parse <span class="hljs-keyword">import</span> urlparse, parse_qs<br><br>SCRIPT_VERSION = <span class="hljs-string">"1.0.3.2"</span><br><br>HEADERS = {<br> <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'</span>,<br> <span class="hljs-string">'accept-encoding'</span>: <span class="hljs-string">'gzip, deflate, br'</span>,<br> <span class="hljs-string">'accept-language'</span>: <span class="hljs-string">'zh-CN,zh-TW;q=0.8,zh;q=0.6,en;q=0.4,ja;q=0.2'</span>,<br> <span class="hljs-string">'cache-control'</span>: <span class="hljs-string">'max-age=0'</span><br>}<br><br>PARSER = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, <br> description=<span class="hljs-string">'GiWiFi认证登录脚本'</span>, <br> epilog=<span class="hljs-string">'(c) 2018 journey.ad'</span>)<br>PARSER.add_argument(<span class="hljs-string">'-g'</span>, <span class="hljs-string">'--gateway'</span>, <span class="hljs-built_in">type</span>=<span class="hljs-built_in">str</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">'网关IP'</span>)<br>PARSER.add_argument(<span class="hljs-string">'-u'</span>, <span class="hljs-string">'--username'</span>, <span class="hljs-built_in">type</span>=<span class="hljs-built_in">str</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">'用户名'</span>)<br>PARSER.add_argument(<span class="hljs-string">'-p'</span>, <span class="hljs-string">'--password'</span>, <span class="hljs-built_in">type</span>=<span class="hljs-built_in">str</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">'密码'</span>)<br>PARSER.add_argument(<span class="hljs-string">'-q'</span>, <span class="hljs-string">'--quit'</span>, action=<span class="hljs-string">'store_true'</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">'登出'</span>)<br>PARSER.add_argument(<span class="hljs-string">'-d'</span>, <span class="hljs-string">'--daemon'</span>, action=<span class="hljs-string">'store_true'</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">'在后台守护运行'</span>)<br>PARSER.add_argument(<span class="hljs-string">'-v'</span>, <span class="hljs-string">'--verbose'</span>, action=<span class="hljs-string">'store_true'</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">'额外输出一些技术性信息'</span>)<br>PARSER.add_argument(<span class="hljs-string">'-V'</span>, <span class="hljs-string">'--version'</span>, action=<span class="hljs-string">'version'</span>, <br> version=<span class="hljs-string">'giwifi-auth-helper {}'</span>.<span class="hljs-built_in">format</span>(SCRIPT_VERSION))<br><br>CONFIG = PARSER.parse_args()<br><br><span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> CONFIG.quit:<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> CONFIG.gateway:<br> CONFIG.gateway = netifaces.gateways()[<span class="hljs-string">'default'</span>][netifaces.AF_INET][<span class="hljs-number">0</span>]<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> CONFIG.password:<br> CONFIG.gateway = <span class="hljs-built_in">input</span>(<span class="hljs-string">'请输入网关地址(%s):'</span> % (CONFIG.gateway)) <span class="hljs-keyword">or</span> CONFIG.gateway<br><br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> CONFIG.username:<br> CONFIG.username = <span class="hljs-built_in">input</span>(<span class="hljs-string">'请输入上网账号:'</span>)<br><br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> CONFIG.password:<br> CONFIG.password = getpass(<span class="hljs-string">'请输入账号密码:'</span>)<br><span class="hljs-keyword">else</span>:<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> CONFIG.gateway:<br> CONFIG.gateway = netifaces.gateways()[<span class="hljs-string">'default'</span>][netifaces.AF_INET][<span class="hljs-number">0</span>]<br> CONFIG.gateway = <span class="hljs-built_in">input</span>(<span class="hljs-string">'请输入网关地址(%s):'</span> % (CONFIG.gateway)) <span class="hljs-keyword">or</span> CONFIG.gateway<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():<br> logcat(<span class="hljs-string">'正在获取网关信息…'</span>)<br><br> <span class="hljs-keyword">try</span>:<br> authUrl = requests.get(<span class="hljs-string">'http://%s:8062/redirect'</span> % (CONFIG.gateway), timeout=<span class="hljs-number">5</span>).url<br> authParmas = {k: v[<span class="hljs-number">0</span>] <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> parse_qs(urlparse(authUrl).query).items()}<br><br> loginPage = requests.get(<span class="hljs-string">'http://login.gwifi.com.cn/cmps/admin.php/api/login/?'</span> + urlparse(authUrl).query, headers=HEADERS, timeout=<span class="hljs-number">5</span>).text<br><br> pagetime = re.search(<span class="hljs-string">r'name="page_time" value="(.*?)"'</span>, loginPage).group(<span class="hljs-number">1</span>)<br> sign = re.search(<span class="hljs-string">r'name="sign" value="(.*?)"'</span>, loginPage).group(<span class="hljs-number">1</span>)<br><br> <span class="hljs-keyword">except</span> requests.exceptions.ConnectionError:<br> logcat(<span class="hljs-string">'连接失败,请检查网关地址是否正确'</span>)<br> <span class="hljs-keyword">return</span><br><br> <span class="hljs-keyword">except</span> requests.exceptions.Timeout:<br> logcat(<span class="hljs-string">'连接超时,可能已超出上网区间'</span>)<br> <span class="hljs-keyword">return</span><br><br> <span class="hljs-keyword">except</span> AttributeError:<br> logcat(<span class="hljs-string">'解析失败,可能网关设备重启或系统已更新'</span>)<br> <span class="hljs-keyword">return</span><br><br> authState = getAuthState(authParmas, sign)<br><br> <span class="hljs-keyword">if</span> CONFIG.quit:<br> logout(authParmas)<br><br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> authState:<br> <span class="hljs-keyword">return</span><br><br> <span class="hljs-keyword">else</span>:<br> <span class="hljs-keyword">if</span> authState[<span class="hljs-string">'auth_state'</span>] == <span class="hljs-number">2</span>:<br> printStatus(authParmas, authState)<br> logcat(<span class="hljs-string">'你已登录,无需再次登录'</span>)<br> <span class="hljs-keyword">else</span>:<br> data = {<br> <span class="hljs-string">'access_type'</span>: authState[<span class="hljs-string">'access_type'</span>],<br> <span class="hljs-string">'acsign'</span>: authState[<span class="hljs-string">'sign'</span>],<br> <span class="hljs-string">'btype'</span>: <span class="hljs-string">'pc'</span>,<br> <span class="hljs-string">'client_mac'</span>: authState[<span class="hljs-string">'client_mac'</span>],<br> <span class="hljs-string">'contact_phone'</span>: <span class="hljs-string">'400-038-5858'</span>,<br> <span class="hljs-string">'devicemode'</span>: <span class="hljs-string">''</span>,<br> <span class="hljs-string">'gw_address'</span>: authParmas[<span class="hljs-string">'gw_address'</span>],<br> <span class="hljs-string">'gw_id'</span>: authParmas[<span class="hljs-string">'gw_id'</span>],<br> <span class="hljs-string">'gw_port'</span>: authParmas[<span class="hljs-string">'gw_port'</span>],<br> <span class="hljs-string">'lastaccessurl'</span>: <span class="hljs-string">''</span>,<br> <span class="hljs-string">'logout_reason'</span>: authState[<span class="hljs-string">'logout_reason'</span>],<br> <span class="hljs-string">'mac'</span>: authParmas[<span class="hljs-string">'mac'</span>],<br> <span class="hljs-string">'name'</span>: CONFIG.username,<br> <span class="hljs-string">'online_time'</span>: authState[<span class="hljs-string">'online_time'</span>],<br> <span class="hljs-string">'page_time'</span>: pagetime,<br> <span class="hljs-string">'password'</span>: CONFIG.password,<br> <span class="hljs-string">'sign'</span>: sign,<br> <span class="hljs-string">'station_cloud'</span>: <span class="hljs-string">'login.gwifi.com.cn'</span>,<br> <span class="hljs-string">'station_sn'</span>: authState[<span class="hljs-string">'station_sn'</span>],<br> <span class="hljs-string">'suggest_phone'</span>: <span class="hljs-string">'400-038-5858'</span>,<br> <span class="hljs-string">'url'</span>: <span class="hljs-string">'http://www.baidu.com'</span>,<br> <span class="hljs-string">'user_agent'</span>: <span class="hljs-string">''</span>,<br> }<br><br> <span class="hljs-keyword">if</span> CONFIG.verbose:<br> logcat(data)<br><br> result = login(data)<br> <span class="hljs-keyword">if</span> result[<span class="hljs-string">'status'</span>]:<br> authState = getAuthState(authParmas, sign)<br> printStatus(authParmas, authState)<br><br> <span class="hljs-keyword">if</span> authState[<span class="hljs-string">'auth_state'</span>] == <span class="hljs-number">2</span>:<br> logcat(<span class="hljs-string">'认证成功'</span>)<br> <span class="hljs-keyword">else</span>:<br> logcat(<span class="hljs-string">'认证失败'</span>)<br> <span class="hljs-keyword">else</span>:<br> logcat(<span class="hljs-string">'认证失败,提示信息:%s'</span> % (result[<span class="hljs-string">'info'</span>]))<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">login</span>(<span class="hljs-params">data</span>):<br> logcat(<span class="hljs-string">'正在尝试认证…'</span>)<br><br> <span class="hljs-keyword">try</span>:<br> resp = json.loads(requests.post(<span class="hljs-string">'http://login.gwifi.com.cn/cmps/admin.php/api/loginaction'</span>, data=data, timeout=<span class="hljs-number">5</span>).text)<br> result = {<br> <span class="hljs-string">'status'</span>: <span class="hljs-literal">False</span>,<br> <span class="hljs-string">'info'</span>: <span class="hljs-literal">None</span><br> }<br><br> <span class="hljs-keyword">if</span> CONFIG.verbose:<br> logcat(resp)<br><br> <span class="hljs-keyword">if</span> <span class="hljs-string">'wifidog/auth'</span> <span class="hljs-keyword">in</span> resp[<span class="hljs-string">'info'</span>]:<br> requests.get(resp[<span class="hljs-string">'info'</span>])<br> result[<span class="hljs-string">'status'</span>] = <span class="hljs-literal">True</span><br> <span class="hljs-keyword">else</span>:<br> result[<span class="hljs-string">'info'</span>] = resp[<span class="hljs-string">'info'</span>]<br><br> <span class="hljs-keyword">except</span> requests.exceptions.Timeout:<br> logcat(<span class="hljs-string">'连接超时,可能已超出上网区间'</span>)<br> <br> <span class="hljs-keyword">finally</span>:<br> <span class="hljs-keyword">return</span> result<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">logout</span>(<span class="hljs-params">authParmas</span>):<br> <span class="hljs-keyword">try</span>:<br> resp = json.loads(requests.get(<span class="hljs-string">'http://%s/getApp.htm?action=logout'</span> % (authParmas[<span class="hljs-string">'gw_address'</span>])).text)<br> <br> <span class="hljs-keyword">except</span> requests.exceptions.Timeout:<br> logcat(<span class="hljs-string">'连接超时,可能已超出上网区间'</span>)<br> <span class="hljs-keyword">return</span><br><br> <span class="hljs-keyword">if</span> resp[<span class="hljs-string">'resultCode'</span>] == <span class="hljs-number">0</span>:<br> logcat(<span class="hljs-string">'下线成功'</span>)<br> <span class="hljs-keyword">else</span>:<br> logcat(<span class="hljs-string">'下线失败'</span>)<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">getAuthState</span>(<span class="hljs-params">authParmas, sign</span>):<br> <span class="hljs-keyword">try</span>:<br> params = {<br> <span class="hljs-string">'ip'</span>: authParmas[<span class="hljs-string">'ip'</span>],<br> <span class="hljs-string">'mac'</span>: authParmas[<span class="hljs-string">'mac'</span>],<br> <span class="hljs-string">'sign'</span>: sign,<br> <span class="hljs-string">'callback'</span>: <span class="hljs-string">''</span><br> }<br> <br> resp = json.loads(requests.get(<span class="hljs-string">'http://%s:%s/wifidog/get_auth_state'</span> % (authParmas[<span class="hljs-string">'gw_address'</span>], authParmas[<span class="hljs-string">'gw_port'</span>]), params=params, timeout=<span class="hljs-number">5</span>).text[<span class="hljs-number">1</span>:-<span class="hljs-number">1</span>])<br> <br> <span class="hljs-keyword">except</span> KeyError:<br> logcat(<span class="hljs-string">'所需参数不存在'</span>)<br> <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br><br> <span class="hljs-keyword">except</span> requests.exceptions.Timeout:<br> logcat(<span class="hljs-string">'连接超时,可能已超出上网区间'</span>)<br> <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br><br> <span class="hljs-keyword">if</span> CONFIG.verbose:<br> logcat(resp)<br><br> <span class="hljs-keyword">if</span> resp[<span class="hljs-string">'resultCode'</span>] == <span class="hljs-number">0</span>:<br> <span class="hljs-keyword">return</span> json.loads(resp[<span class="hljs-string">'data'</span>])<br> <span class="hljs-keyword">else</span>:<br> <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">printStatus</span>(<span class="hljs-params">authParmas, authState</span>):<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> CONFIG.verbose:<br> clear()<br><br> <span class="hljs-built_in">print</span>(<br><span class="hljs-string">'''--------------------------------------------</span><br><span class="hljs-string">SSID: %s</span><br><span class="hljs-string">AP MAC: %s</span><br><span class="hljs-string">GateWay: %s</span><br><span class="hljs-string">IP: %s</span><br><span class="hljs-string">MAC: %s</span><br><span class="hljs-string">Station SN: %s</span><br><span class="hljs-string">Logged: %s</span><br><span class="hljs-string">--------------------------------------------'''</span><br> % (<br> authParmas[<span class="hljs-string">'gw_id'</span>],<br> authParmas[<span class="hljs-string">'apmac'</span>],<br> authParmas[<span class="hljs-string">'gw_address'</span>],<br> authParmas[<span class="hljs-string">'ip'</span>],<br> authParmas[<span class="hljs-string">'mac'</span>],<br> authState[<span class="hljs-string">'station_sn'</span>],<br> <span class="hljs-string">'yes'</span> <span class="hljs-keyword">if</span>(authState[<span class="hljs-string">'auth_state'</span>] == <span class="hljs-number">2</span>) <span class="hljs-keyword">else</span> <span class="hljs-string">'no'</span><br> )<br> )<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">clear</span>():<br> os.system(<span class="hljs-string">'cls'</span> <span class="hljs-keyword">if</span> os.name == <span class="hljs-string">'nt'</span> <span class="hljs-keyword">else</span> <span class="hljs-string">'clear'</span>)<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">logcat</span>(<span class="hljs-params">msg, level=<span class="hljs-string">'I'</span></span>):<br> <span class="hljs-built_in">print</span>(<span class="hljs-string">'%s %s: %s'</span> % (time.ctime().split(<span class="hljs-string">' '</span>)[-<span class="hljs-number">2</span>], level, msg))<br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:<br> <span class="hljs-keyword">if</span> CONFIG.daemon:<br> <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br> main()<br> time.sleep(<span class="hljs-number">30</span>)<br> <span class="hljs-keyword">else</span>:<br> main()<br> <span class="hljs-built_in">input</span>()<br></code></pre></td></tr></table></figure><h1 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h1><p><img src="https://gcore.jsdelivr.net/gh/muzihuaner/huancdn/img/20210322234221.png" alt="image-20210322234221276"></p><p>本文参考:</p><p>1.<a href="https://nocilol.me/archives/lab/giwifi-auth-process-analysis-and-simulation-login/">https://nocilol.me/archives/lab/giwifi-auth-process-analysis-and-simulation-login/</a></p><p>2.<a href="https://github.com/icepie/giwifi-gear/wiki/GiWiFi-%E5%88%86%E6%9E%90">https://github.com/icepie/giwifi-gear/wiki/GiWiFi-%E5%88%86%E6%9E%90</a></p>]]></content>
<categories>
<category>教程</category>
</categories>
<tags>
<tag>Giwifi</tag>
<tag>Python</tag>