基於Web3.0的區塊鏈圖片上傳

在開始之前,我們先簡單了解一下基本的概念,我大致歸納為以下幾個點 什麼是Web3.0,和區塊鏈又有什麼關係?(上回的文章不就派上用場了) 需求:開發一個基於Python的Web 3.0圖片上傳系統。這個系統將允許用戶上傳圖片,並將圖片儲存在去中心化的網路上,同時記錄交易資訊在區塊鏈上。 本來只是寫著玩的,想過要寫成用戶認證、檔案操作集成全套管理的,讓他「終將成為圖片上傳服務的最終解決方案」。實際下來卻發現不是很實際,就作罷了,奈何我一直以來對圖片這麼執著。 步驟概述 環境設定:使用Python開發,安裝必要的Python函式庫。 IPFS整合:將圖片上傳到IPFS,取得圖片的CID(內容識別碼)。 區塊鏈整合:將IPFS CID記錄在區塊鏈上。 Web介面:使用Flask建立一個Web介面,允許用戶上傳圖片。 詳細步驟 1. 環境設定 安裝所需的Python函式庫: pip install flask web3 ipfshttpclient 2. IPFS整合 IPFS(星際檔案系統)是一種點對點的檔案儲存協定。我們可以使用ipfshttpclient函式庫來與IPFS網路互動。 首先,請確保你已經安裝並運行了IPFS節點。如果還沒有安裝IPFS,可以在IPFS官網找到安裝指南。 以下是上傳圖片到IPFS的程式碼範例: import ipfshttpclient def upload_to_ipfs(file_path): client = ipfshttpclient.connect('/ip4/127.0.0.1/tcp/5001') res = client.add(file_path) return res['Hash'] 3. 區塊鏈整合 使用web3.py函式庫將IPFS CID記錄到區塊鏈上。我們將以太坊(Ethereum)作為範例區塊鏈。 以下是一個簡單的智能合約範例,用於儲存IPFS CID: pragma solidity ^0.8.0; contract IPFSStorage { mapping(address => string[]) public userCIDs; function storeCID(string memory cid) public { userCIDs[msg.sender].push(cid); } function getCIDs() public view returns (string[] memory) { return userCIDs[msg.sender]; } } 編譯並部署該合約後,使用以下Python程式碼與智能合約互動: ...

2024年6月17日 · 2 min · MoeJue

使用ESP8266-NodeMCU開發板顯示一下我的QQ頭像

诶,說好的自己寫esp8266的開發板韌體的我回來了。 20年說好的,今天回來還願了 ESP8266串口WiFi模塊 - WiFi殺手 今天我們把OLED顯示屏也接上,我此次買的是4腳的OLED(128*64),不支持彩色顯示的。 NodeMCU開發板 NodeMCU是一個開源的IoT物聯網硬體開發板,由於它支持WIFI功能且使用方法十分類似Arduino開發板,所以近些年獲得了越來越多來自全世界的創客朋友們的青睞。NodeMCU尺寸與Arduino Nano類似。它並不是Arduino團隊開發的,但是我們也可以使用Arduino IDE 對它進行開發。 作為萬物互聯的IoT基礎,首先物聯網控制板的成本不能過高。高昂的物聯網控制元件不利於項目成本控制也不利於廣大創客愛好者學習和使用它。在這一點上,NodeMCU比樹莓派以及Arduino家族的IoT平台等更具優勢。 細心的朋友可能已經發現了,這會我開發板叫做ESP8266-NodeMCU。然而在其它的網站或資料中,有時是用ESP8266有時是用NodeMCU。那麼ESP8266和NodeMCU之間是什麼關係呢? ESP8266是一塊晶片(被鐵殼子包住的方形的東西),而NodeMCU則是以ESP8266晶片為核心的開發板,如下圖所示。 要想對ESP8266晶片來進行實驗操作是很困難的,因為我們很難將小小一枚晶片上的引腳與我們的電腦連接起來然後再進行上傳程式等操作。於是便誕生了圍繞ESP8266晶片的各種開發板。NodeMCU就是這些開發板中的一員。 NodeMCU開發板上的兩排插針與ESP8266晶片的引腳相連。有了開發板上的兩排插針,我們就可以很輕鬆的使用杜邦線將晶片的引腳接到實驗電路中。NodeMCU開發板上還配有USB接口以及電壓轉換電路。這些為我們提供了很大的便利。我們只要用一根USB數據線就可以輕鬆的實現為ESP8266供電以及上傳程式的操作。當然,NodeMCU開發板上的電路功能還不止這些,我就不再繼續延伸下去了 驅動的安裝 雖然之前已經講過開發板的驅動安裝了,但是不夠詳細。 目前市面上的ESP8266驅動有多種,即使是同一塊NodeMcu的開發板驅動也可能是不一樣的。目前主流的是CH340和CP210X的驅動 驅動的下載請直接去晶片的製造商的官網下載即可 CP210X:https://cn.silabs.com/developers/usb-to-uart-bridge-vcp-drivers CH340C:https://www.wch.cn/downloads/CH341SER_EXE.html 下載適合自己平台的驅動安裝程式 需要看清楚自己的串口晶片型號是否在驅動程式的支持範圍內 如何查看自己的開發板需要什麼驅動 直接看,下圖中豎著的長方形黑條,那個就是USB轉串口晶片。上面會寫明晶片的型號名稱 問你買的商家 顯示屏的焊接 不要焊接錯了,不然會燒壞晶片的 OLED接線: GND - GND VCC - VCC SCL - GPIO5(D1) SDA - GPIO4(D2) 烙鐵加熱中 下面就是焊接好的,注意接線,不一定是按我這個順序的,要看名稱 Arduino IDE的安裝 下載arduino IDE https://www.arduino.cc/en/software 安裝 安裝還要我教? 配置 點擊工具-開發板-開發板管理器,在設置中寫上開發板地址:http://arduino.esp8266.com/stable/package_esp8266com_index.json 之後就會自動下載相應的支援庫文件了,期間需要保證網絡的科學性 選擇開發板 NodeMCU1.0(ESP-12EModule) 選擇端口 在電腦的設備管理器中找到你的開發板的COM口 Arduino代碼 有時候我覺得我逼逼叨叨說一大堆還不如直接上代碼來的直接,我覺得你肯定也是想直接看代碼的而不是聽我說一堆廢話 我也盡可能在代碼中註釋了(編寫arduino代碼請遵循C/C++語言規範) 下列的例子中,連接WiFi使用的是庫,首次連接需要使用手機連接ESP8266發送出來的WiFi先進行配網操作。寫出屏幕使用的是庫,支持中文直接寫出 這是一個簡單的連接WiFi和屏幕顯示圖片的示例 #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <ESP8266WiFi.h> #include <NTPClient.h> #include <WiFiManager.h> #include <U8g2lib.h> #define SDA 4 // SDA引脚,默认gpio4(D2) #define SCL 5 // SCL引脚,默认gpio5(D1) Adafruit_SSD1306 oled(128, 64, &Wire,-1); //OLED 屏幕实例化 WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP,"pool.ntp.org", 8*3600, 60000); U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE); // 选择显示屏幕 // 只执行一次 void setup() { u8g2.begin(); // 初始化 u8g2.enableUTF8Print(); // UTF8允许 u8g2.setFont(u8g2_font_wqy12_t_gb2312b); //字体大小 u8g2_font_wqy15_t_gb2312b // 初始化屏幕 OLED_Init(); OLED_Showchin(1,13,"正在连接WiFi....",0); WiFiManager wifiManager; wifiManager.autoConnect("ESP8266"); OLED_Showchin(1,27,"WiFi连接成功!",0); OLED_Showchin(1,41,"名称: " + WiFi.SSID(),0); OLED_Showchin(1,55,"IP: " + WiFi.localIP().toString(),1); // 获取时间 timeClient.begin(); u8g2.setFont(u8g2_font_wqy15_t_gb2312b); //字体大小 u8g2_font_wqy15_t_gb2312b OLED_Showchin(1,13,"宁小建",0); OLED_Showchin(1,27,"hhhhhhhhhhhh",0); OLED_Showchin(1,55,"大傻逼哈哈哈",1); timeClient.update(); OLED_Showchin(1,20,"当前北京时间: ",0); OLED_Showchin(1,41,timeClient.getFormattedTime(),1); delay(1000); OLED_img(); } // 重复执行程序 void loop() { // 更新时间 // timeClient.update(); // OLED_Showchin(1,27,"当前北京时间: ",0); // OLED_Showchin(1,41,timeClient.getFormattedTime(),0); } // 打印输出到屏幕(支持中文) void OLED_Showchin(uint8_t x, uint8_t y, String string, uint8_t boot) { u8g2.setCursor(x, y); //设置显示坐标 u8g2.print(string); // 指定缓存区需要打印的字符串 u8g2.sendBuffer(); // 将定位信息发送到缓冲区 if(boot == 1){ delay(1000); u8g2.clearBuffer(); // 清除缓存,其实初始化里有清除,循环时一定要加上 } } // 屏幕初始化 void OLED_Init() { oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); //"SSD1306_SWITCHCAPVCC"表示显示器为OLED ,"0x3C"为OLED屏幕默认通信地址 oled.setTextColor(WHITE);//开像素点发光 oled.clearDisplay();//清屏 } // 输出屏幕 void OLED_ShowString(uint8_t x, uint8_t y, uint8_t font_size, String string) { oled.setTextSize(font_size); //设置字体尺寸 (>=1) oled.setCursor(x, y); //设置显示坐标 oled.println(string); //显示内容 oled.display(); //开启显示 } // 绘画 void OLED_img() { // 图片数据 const unsigned char gImage_1[518] = { 0X00,0X01,0X40,0X00,0X40,0X00, 0X00,0X40,0X00,0X00,0X00,0X3E,0XF0,0X00,0X00,0X80,0X00,0X00,0X00,0X1F,0XE0,0X00, 0X00,0X00,0X00,0X00,0X00,0X06,0XB0,0X00,0X01,0X00,0X00,0X00,0X00,0X03,0XF8,0X00, 0X00,0X00,0X00,0X00,0X00,0X03,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XDC,0X00, 0X04,0X00,0X00,0X00,0X00,0X01,0XC0,0X00,0X0E,0X00,0X00,0X00,0X00,0X00,0X80,0X00, 0X06,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X00,0X00,0X00,0X10,0X00,0X00,0X00, 0X08,0X00,0X00,0X00,0X0E,0X00,0X00,0X00,0X08,0X00,0X00,0X00,0X8F,0X00,0X00,0X00, 0X00,0X00,0X02,0X02,0X47,0X00,0X00,0X00,0X00,0X00,0X01,0X10,0X63,0X80,0X00,0X00, 0X00,0X00,0X01,0XC9,0X73,0XC0,0X00,0X00,0X00,0X00,0X00,0XE4,0X79,0XE0,0X00,0X00, 0X00,0X02,0X00,0XFA,0XF9,0XE0,0X00,0X00,0X10,0X02,0X00,0X7D,0X8C,0XF0,0X00,0X00, 0X10,0X03,0X01,0X7E,0X90,0XF1,0X80,0X00,0X10,0X01,0X20,0XFD,0X1C,0X7B,0XE0,0X00, 0X00,0X01,0XA0,0X7D,0X03,0X7B,0X20,0X00,0X10,0X01,0XD8,0XFF,0X8B,0X7E,0X30,0X00, 0X00,0X01,0XFC,0X7F,0X83,0XB6,0X10,0X00,0X00,0X00,0XF7,0XFF,0XC7,0XBE,0X10,0X00, 0X00,0X01,0X8F,0XFF,0XE3,0XF6,0X10,0X00,0X01,0X01,0X4F,0XFF,0XFF,0XFF,0X10,0X00, 0X00,0X01,0XCF,0XFF,0XFF,0XDF,0X10,0X00,0X00,0X01,0XC3,0XFF,0XFF,0XDF,0X70,0X00, 0X01,0X03,0XE3,0XFF,0XFF,0XDF,0XE0,0X00,0X04,0X01,0XE7,0XFF,0XFF,0XDF,0XE4,0X00, 0X07,0X00,0XFB,0XFF,0XFF,0XDF,0XC0,0X00,0X07,0X00,0XFB,0XFF,0XFF,0XFE,0X00,0X00, 0X13,0X00,0X7F,0XFF,0XFF,0XFC,0X00,0X00,0X01,0X20,0X3F,0XFF,0XFF,0XFC,0X00,0X00, 0X00,0X00,0X3F,0XFF,0XFF,0XF8,0X00,0X0B,0X00,0X00,0X1F,0XFE,0X0F,0XF8,0X00,0X1F, 0X00,0X00,0X1F,0XF8,0X6F,0XF0,0X00,0XFF,0X00,0X00,0X1F,0XE1,0XFF,0XF0,0X05,0XFF, 0X00,0X00,0X0F,0XF3,0XFF,0XE0,0X03,0XFF,0X00,0X40,0X0F,0XF7,0XFF,0XC0,0X07,0XFF, 0X00,0X00,0X07,0XFF,0XFF,0X80,0X07,0XFF,0X08,0X00,0X07,0XFF,0XFF,0X00,0X0F,0XFF, 0X00,0X00,0X23,0XFF,0XFE,0X00,0X0F,0XFF,0X00,0X08,0X60,0XFF,0XFE,0X00,0X0F,0XFF, 0X00,0X40,0X20,0X3F,0XFE,0X00,0X1F,0XFF,0X00,0X00,0X10,0X0B,0XFF,0X80,0X1F,0XFF, 0X00,0X00,0X40,0X00,0X3F,0X00,0X1F,0XFF,0X00,0X00,0X10,0X00,0X3F,0X00,0X1F,0XFF, 0X20,0X00,0X02,0X00,0X3F,0X00,0X3F,0XFF,0X00,0X00,0X00,0X00,0X7F,0X80,0X3F,0XFF, 0X00,0X00,0X00,0X10,0X7F,0X80,0X7F,0XFF,0X00,0X00,0X00,0X80,0X7F,0X80,0X7F,0XFF, 0X10,0X00,0X00,0X00,0X7F,0X80,0XFF,0XFF,0X30,0X00,0X00,0X00,0X7F,0X80,0XFF,0XFF, 0X10,0X10,0X00,0X00,0X7F,0XC1,0XFF,0XFF,0X00,0X00,0X00,0X00,0X7F,0XF3,0XFF,0XFF, 0X00,0X00,0X01,0X00,0X3F,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X04,0X3F,0XFF,0XFF,0XFF, 0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0X00,0X00,0X10,0X80,0X1F,0XFF,0XFF,0XFF, 0X01,0X00,0X00,0X05,0X1F,0XFF,0XFF,0XFB,0X00,0X00,0X00,0X00,0X1F,0XF7,0XFF,0XFC, 0X00,0X00,0X00,0X00,0X1F,0XFB,0XFF,0XFF,0X00,0X00,0X40,0X00,0X19,0XFF,0XFF,0XFF, }; oled.clearDisplay(); oled.drawBitmap(3, 1, gImage_1, 64, 64, WHITE); oled.display(); } ...

2024年6月16日 · 4 min · MoeJue

很抱歉,我回來了!

那是一個月黑風高、風雨交加、伸手不見五指的黑夜,冥冥之中好似要發生點什麼 因為出了個「意外」再加上疫情原因,我一度變成了「植物人」,差點去了二次元,好在「搶救」回來了。這幾年找我的消息我也收不到了,感謝那些還在和關心我的人,謝謝。 錯的並不是我,而是這個冥冥之中註定的世界 這些年找我的人和事,我也全部不知道,QQ、微信一些消息太久也都收不到了 看到我多年未亮起的頭像重新亮了起來,不少朋友都來問我怎麼回事。 很感謝那些素未謀面的網友,或許叫朋友更親切些,你們還一直惦記著我,讓我很是感動。 一找就是找了我三年 滿世界的找我 感動的不要不要的 下面才是正文 關於部落格 部落格首次建成時間是2016-06-09,如今已經成立了快8年之久了,在各種災難中也頑強地生存了下來 期間也認識了好多好多的小夥伴,一起討論,一起進步,一起成長。所以我並不想讓部落格就此消失 部落格數據原本有自動備份到七牛雲的,但直到現在才知道,備份不知道什麼原因,19年10月份左右就停掉了 都說網際網路是有記憶的,本著「頭可斷血可流,數據不能丟」的精神,我在茫茫網路中尋找數日,終究還是讓我找到了部落格的網站存檔。 可以點擊這裡去看我的部落格歷史版本archive (國外著名的網站檔案館項目) 於是就寫了個Python腳本把文章和評論數據給爬下來了。 爬完後我發現有人已經給我備份了(我部落格之前是別人贊助的三年) 部落格搬遷 部落格搬遷到部落格園,其實也是不得已而為之 部落格的原域名(52ecy.cn,moeins.cn,moeins.com)在到期後被人搶註,溝通無果後,一時半會是拿不回來的了 迫於無奈吧,只能暫且先將部落格搬遷到部落格園來(之後是否再自建的話再做打算吧)。另一方面也可能是現在沒有太多閒時間來折騰自己的系統,放在部落格園反倒是更加省心省力。但是評論就沒那麼方便了,需要登入才可以發表評論,當然有啥問題也可以直接在群裡@我 其實早在18年底的時候,我就已經有想換主題的想法了->這下真鴿了 (我可真能拖,太佩服我自己了) 無奈之前的emlog系統沒有合適現成的,自己又懶得移植,便一直一拖再拖。 原來那個主題我一直就想換掉了,因為不太好看,沒有個性,就是規規矩矩的,並不符合我的個性和風格 但是呢,我審美雖然特別棒,但你要讓我自己寫一套符合我審美的主題出來那就是有點困難了 後來突然看到部落格園用戶不忘編碼的部落格,心想部落格園還支持這樣自己美化。 一句「我又不想他部落格從此也失聯,無法訪問打開」 後便決定暫時先搬遷到部落格園再說吧。 一直就想換這種二次元風格的主題了 目前此部落格美化風格樣式基於櫻花莊的白貓的WordPress主題Sakura,不忘編碼移植,但BUG和細節問題較多,我又花了兩天優化了一下,但也好多頁面沒優化,之後再慢慢來吧 (能明天再做的事為什麼不留給明天的我去做呢) 由於之前的emlog部落格使用的是HTML的TinyMCE編輯器,而且還是很老的版本,所以生成的文章的HTML程式碼也是相當的混亂,所以搬遷至部落格園的markdown格式的時候出現了很多的樣式不相容問題,我也已經盡可能地修復了一些,但也沒法保證所有文章都能正常地顯示,看到的話再慢慢修吧 部落格園不支持自建部落格系統的一鍵搬遷功能,所以文章的發布時間和評論的資訊就不能一同搬遷了,但我又想保留原汁原味,所以我就一併寫到文章當中了,私密評論也還是隱藏了。 (自建部落格系統的問題也和部落格園團隊溝通了,說後期開發會加上,也不為難他們了,他們也入不敷出了,文章的發布使用了Cnblog的VScode插件) 友情連結我也單獨搞了一個頁面給搬遷過去了,但也很多友鏈的網站也已經無法訪問了,有的也已經下掉友鏈了。 現在的我也不是獨立域名了,都不好意思再去申請友鏈了….. 之前部落格的所有圖片都是存在新浪的,一直擔心哪天又給丟了,所以平常都是一份七牛雲,一份新浪,現在也全部給搬遷到部落格園來了 我為什麼要寫部落格? 有人會覺得這些有這麼重要嗎? 有時候我也是想說點什麼,想寫點什麼,但又沒人說,沒地方寫,就是需要那麼一個地方 我做部落格也不是為了什麼流量啊,賺錢之類的,就想搞一片自己的小天地,在自己的小圈子裡瞎混噠 也許也正因這一份熱愛,所以我才能慢慢堅持下來,奈何事與願違,出了一點意外 以前好多部落格圈的朋友都要麼不見了,要麼都不更新了,真的好可惜啊,我都還沒來得及認識他們 (尤其是月宅那貨) @寒穹 那貨還說我:「阿珏,那麼久了怎麼還那麼二次元」。 我想這麼多年來,一直沒變的就是我了吧。 很高興,也很感謝還有那麼多人記得我,對我那麼好。 好像不該發這麼多圖片的 紀念逝去的部落格,永遠活在我的127裡 Python程式碼 搬遷的Python的程式碼,雖然沒啥用,但算是記錄一下,供有需要的人學習學習 點擊查看程式碼 import os import re import time import requests from bs4 import BeautifulSoup from urllib.parse import urlparse, parse_qs # 指定文件路径 file_path = "C:\\Users\\Administrator\\Desktop\\blog\\content.txt" save_folder = "C:\\Users\\Administrator\\Desktop\\blog\\content\\" def save_to_file(data, file_name): try: file_path = os.path.join(save_folder, file_name + ".txt") with open(file_path, 'a', encoding='utf-8') as file: file.write(data) print("数据已成功保存到文件:", file_path) except Exception as e: print("保存文件时出错:", e) def remove_html_tags(text): soup = BeautifulSoup(text, 'html.parser') return soup.get_text() def comment(html_content): comment_matches = re.findall(r'<div class="comment (.*?)" id="comment-\d+">[\s\S]*?<img .*?inal=".*?202.*?/([^"]+)"/>[\s\S]*?<div ' + 'class="comment-content">(.*?)</div>[\s\S]*?itle=".*?">(.*?)</span>[\s\S]*?<span class="comment-time">(.*?)</span>', html_content, re.DOTALL) article_comments = '' if comment_matches: i = 0 for comment_match in comment_matches: if 'comment-children' in comment_match[0]: i += 1 is_reply_comment = '>' * i else: is_reply_comment = '>' i = 1 #头像 大小控制在40 # 兼容gravatar头像 https://secure.gravatar.com/avatar/ if 'gravatar.com' in comment_match[1]: avatar_url = '![](' + str(re.sub(r'(\?|&)s=\d+', '\\1s=40', str(comment_match[1]))) + ') ' else: parsed_url = urlparse(comment_match[1]) query_params = parse_qs(parsed_url.query) dst_uin = query_params.get('dst_uin', ['1638211921']) avatar_url = '![]('+'https://q1.qlogo.cn/g?b=qq&nk='+str(dst_uin[0])+'&s=40'+') ' comment_content = comment_match[2].strip() nickname = comment_match[3].strip() comment_time = comment_match[4].strip() link_url = re.search(r'030.*?/(.*?)" .*? rel', nickname) # 构造评论的markdown格式 comment_content = is_reply_comment + comment_content.replace('\n', '>') comment_content = comment_content.replace('##这篇评论是私密评论##', '[#这篇评论是私密评论#]') # 替换表情图片 soup = BeautifulSoup(comment_content, 'html.parser') for img in soup.find_all('img'): title_text = img.get('title', '') img.replace_with('[#'+title_text+']') comment_content = soup.get_text() # 保存评论用户的URL地址 if link_url: nickname = '['+remove_html_tags(nickname)+']' link_url = '(' + link_url[1] + ') ' else: link_url = '' nickname = remove_html_tags(nickname) + ' ' if i == 1: article_comments += '\n' article_comments += is_reply_comment + avatar_url + nickname + link_url + comment_time + '\n' + comment_content + '\n' return article_comments else: return '' def process_article(url): print("当前执行===="+url) response = requests.get(url) if response.status_code == 200: html_content = response.text soup = BeautifulSoup(html_content, 'html.parser') article_title = soup.find('h1', class_='article-title') article_mate = soup.find('div', class_='article-meta') article_article = soup.find('article', class_='article-content') soup_content = BeautifulSoup(article_article.prettify(), 'html.parser') img_tags = soup_content.find_all('img') pattern = r"https://web.*?_/" for img_tag in img_tags: if 'data-original' in img_tag.attrs: original_url = img_tag['data-original'] else: original_url = img_tag['src'] cleaned_url = re.sub(pattern, '', original_url) new_url = 'https://image.baidu.com/search/down?url=' + cleaned_url img_tag['src'] = new_url del img_tag['data-original'] article_comment = soup.find('div', class_='article_comment_list') data = "###### `当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`\n\n" + '###' + article_title.text.strip()+'\n\n'+article_mate.text.strip().replace('\n', '').replace('\r', '').replace('\t', '')+'\n' + soup_content.prettify().replace('<article class="article-content">', '').replace('</article>', '') save_to_file(data + '\n网友评论:\n\n', article_title.text.strip()) data = comment(html_content) if not data: return save_to_file(data, article_title.text.strip()) if article_comment: comment_links = re.findall(r'<a\s+href="(.*?)nts"', str(article_comment)) if comment_links: print('有分页评论数据') for link in comment_links: url = link +"nts" print(url) response = requests.get(url) if response.status_code == 200: html_content = response.text data = comment(html_content) if not data: return save_to_file(data, article_title.text.strip()) print("写分页评论数据中") else: print("Failed to retrieve the webpage.") def main(): with open(file_path, 'r', encoding='utf-8') as file: for line in file: segments = line.strip().split("----") if len(segments) > 0: url = segments[0] process_article(url) else: print("No URL found in the line.") print('开启下一篇文章') time.sleep(4) if __name__ == "__main__": main()

2024年6月16日 · 3 min · MoeJue

2020年遲到的年終總結

我一直在想究竟要不要寫年終總結,又該寫點什麼好呢 糾結了一個多月,這件事一直放在心裡,直到前幾天和楊小姐傑打遊戲時,問我:「年終總結寫了嗎?」這才讓我決定一定要寫。 去年,2020年,因為疫情的原因,讓我感覺這一年過得非常快,什麼事情都還沒有開始做就結束了 這也使得我感覺沒啥好總結的,不知道從哪開始總結 這是18年的年終總結 –> 我以為我會暴富,但是我沒有。 今年就沒有往年那麼精彩的文案了。 在 文章歸檔 這裡還是可以很清楚地看到所有文章和發布的時間,2020年我變成了月更部落格,但每天還是會來看看這點不變。 部落格 感覺這一年部落格活生生地變成了開箱部落格,我變成了開箱UP主,但實際上開箱最早能追溯到2018年,那時就已經有了。意思就是我開了兩年箱子 雖然也寫過那麼幾篇其他類型的文章,但給我的感覺還是有點空虛,“new"了一年,還是沒能給自己"new"出一個對象 生活 因為疫情,工作擱置,又在家多待了幾個月,這也可能是我感覺空虛的原因之一吧。 下半年我又因拒絕無意義的加班,拍拍屁股離開了公司。 租了兩個月房,吃了兩個月外賣,學了兩個月車,駕照到手,離開了廣東。(這段話要帶著滄桑的語氣去讀) 2021 上幾個月去出入境大廳辦護照,又因為疫情的原因,沒能給我辦下來。 2021年希望疫情能有所緩解,這樣我就能趁機去辦個護照了。 我想就這一兩年出趟國 - -> 日本或者更多國家。有人問過我為什麼,我的回答是:「乘上與平常相反的電車,去看看那未曾見過的風景」 買個GoPro,記錄生活的點點滴滴,為旅行增添回放 2020年有點不太容易,有點空虛,沒有做太多事,但新的一年我還是會朝著自己的夢想前行,那些還沒開始做的事情,接下來的日子去一點一點地把它完成了吧。

2021年1月26日 · 1 min · MoeJue

聖誕快樂 禮物

Merry Christmas 聖誕快樂!! 我的聖誕禮物,yes~ 眨眼間已經到了2020年底了,今年硬體廠商接連發力,前有英特爾打性價比戰爭發佈了加量不加價的英特爾十代桌面級處理器,後有英偉達RTX3070暴打自家上代消費級旗艦顯示卡,可謂是好不熱鬧,而要完美發揮這些效能硬體的潛力,一塊優秀的主機板自然也不可或缺華碩TUF GAMING電競特工主機板以紮實的用料,時尚的設計以及親民的價格廣受歡迎,而今年剛發佈的定位中端市場的重砲手系列,擁有更強悍供電配置、2.5G有線網卡、加強裝甲等從旗艦級產品下放的新特性,定價卻和其他中端產品無異,該系列自然也廣受DIY愛好者們的歡迎 貼紙…… 重砲手系列繼承了TUF GAMING系列原本的硬漢風格,依舊採用了黑綠色為主體,再點綴著黃顏色的LOGO,這是TUF GAMING特種部隊一貫的風格,辨識度很高。 主機板外觀透露著十足的電競氣息,大大的TUF GAMING的logo印在碩大的散熱裝甲上 使用了全新的LAG1200介面,不相容十代以前的處理器,不過好像是會支援後面11代的。 記憶體插槽方面,華碩TUF GAMING B460M-PRO重砲手主機板提供4根DDR4記憶體插槽,頻率可達2933MHz,並且搭載了華碩獨家OptiMem記憶體優化技術,可以顯著提升記憶體超頻空間和穩定性。最高支援128GB記憶體。華碩並對這款主機板1 3和2 4位置做了不同的顏色標註,提示使用者使用兩根記憶體時記憶體的插法 在MATX版型上,華碩 TUF GAMING B460M-PRO重砲手主機板對熱量發熱比較嚴重的供電、晶片組用了大量的磨砂表面處理的散熱裝甲。這樣的設計不僅僅能夠快速帶走主機板的熱量,也給主機板帶來非常強烈的精緻感和設計感。 顯示卡插槽方面,這款主機板提供了兩根PCIe長插槽。其中一根裝備了金屬保護裝甲,可以防止顯示卡插拔造成意外損壞, 並且這根插槽為X16模式,只會使用一個獨顯的使用者建議將顯示卡插在這根插槽上。 再來看看主機板的I/O介面,華碩 TUF GAMING B460M-PRO重砲手主機板的I/O擋板是集成在主機板上的,安裝時減少了背板的安裝步驟,同時主機板的一體性更強,一體I/O擋板的設計在以往的華碩高端主機板上才能見到,如今也是下放到了B460晶片組的主機板上,避免裝機時漏掉,還可以防塵防靜電。 這款主機板提供了兩個USB 2.0介面,4個USB 3.1Gen1介面,一個HDMI介面和一個DP介面,此外還有一個2.5Gb網路孔和5個常規的音訊介面 。 SATA介面準備了6個,三個一組,並且第二組插槽是橫向排的,這樣可以避免大顯示卡太長擋住介面 最後在音訊方面,這款主機板使用了Realtek S1200A高品質音訊晶片,具備108dB訊噪比輸出和 103dB 訊噪比,是目前頂級的音效卡晶片之一。 盒背面參數預覽 CPU簡單看一眼,因為沒啥太多可以說的,我放到了最後。i5-10600kf中國盒,全國聯保三年,由於帶了"K"後綴,從側邊也可以看出,這款CPU是不帶散熱器的,需要自己另外購買。

2020年12月25日 · 1 min · MoeJue

論網速快慢的區別

論網速快慢的區別 隨著網路的普及,使用者對響應速度快慢越來越重視了,網站越快,使用者的黏性和轉化率也會越高。 簡單來說,就是要提高速度!影響網站速度的因素有很多,比如…………………. 一本正經可不是我的風格,下面請看我的表演 想法起源: 一開始的想法是使用純CSS進行實現,把底圖base64編碼後直接放在background-image上,就可以達到背景圖片與網頁一同載入出來的效果 第一步: 首先將提前準備好的素材圖片進行處理,拔下泳衣和泳裙 第二步: 新建個HTML檔案 第三步: 完成。。 然後就發現個問題,由於我的底圖檔案大小達到了12兆,編碼後的字串過大,導致網頁載入又卡又慢,實在無使用者體驗 而且這種方式載入的底圖會突然的顯示出來,過於唐突,效果不好 後改用: CSS+JavaScript進行實現,由background-image直接載入背景圖片,能達到逐漸顯示的效果,待底圖載入完畢後再由JS動態插入配圖 window.onload = function(){ var img=new Image(); img.src=‘裸体.jpg’; if(img.width==0){ alert(‘圖片載入失敗’) }else{ document.getElementById(“泳衣”).style.backgroundImage=“url(泳衣.png)”; document.getElementById(“泳裙”).style.backgroundImage=“url(泳裙.png)”; } } 不禁感慨一句,什麼破網路,慢得連人物圖片的衣服都載入不出來

2020年11月7日 · 1 min · MoeJue

今天你過節了嗎?

一生二、二生四、程式碼生萬物……程式設計師們創造的世界,為人類提供了更多可能 又到了一年一度的1020程式設計師節,每年這個時候我不管多忙,都會準時地來寫一篇。 今年沒寫什麼開源專案,但也寫了不少程式碼,連起來可繞地球兩圈。 2020-1024=996?? 去年鬧得沸沸揚揚的996,這難道是冥冥之中註定的了 今年好像沒什麼好的文案跟大家分享。。 那就讓我們面向ACG程式設計吧~~! 讓我們看看往期的吧 2019年 1024程式設計師節,寫最棒的coding,做最靚的仔 2018年 1024程式設計師節快樂 2017年 1024程式設計師節快樂 2016年 程式設計師的節日1024!今天你過節了嗎~ 這也意味著,我的部落格已經陪我度過五年了,感謝這一路以來的你和我!

2020年10月24日 · 1 min · MoeJue

真 · 逃避現實

一直以來我都有一個想買VR設備的願望,今天終於圓了 在 @本群吉祥物 的推薦下,買了Oculus品牌的VR一體機 開卡省錢卡 -> 領優惠券 -> 儲值 -> 下單 -> 一氣呵成 (心在淌血) 由於Oculus品牌沒有進入中國市場等原因,所以我這也捆綁買了一個千兆的路由器 到貨就是兩個大箱子 一個是裝著VR本體的,商家額外贈送了一個USB充電電池,SMARTOOOLS西班牙品牌,貌似還行 另外一個箱子則是我的千兆路由器和好幾百一根的USB3.0 link線 長得跟個花生殼似的路由器 一堆看不懂的說明書,還是外置風扇(#哭笑)。由於這個路由器品牌也是國外的,三線插頭是歐洲標準,國內的三孔插座還得接個轉換器 外包裝 - 反面,下面放著一些熱門遊戲推薦 正面,簡約炫酷 包裝裡面的盒子,印著Oculus的logo 掀起蓋子,哇塞 Oculus Quest 六自由度VR,是目前市面上最強VR一體機 官方有附帶一對手柄電池,和設備基本操作說明書,和一本厚厚的詳細到看不懂的說明書 擺拍,主機+左右手柄 接下來就是開機上手,下載我心心念念已久的Beat Saber、VRChat……開啟我的逃避現實之旅…….. 後話: 一般開箱我都不做評測,因為專業的評測需要專業的學術知識去支撐,還需要會說那些厲害的術語。但是我不會,我也不想誤導看我文章的人,一本正經的胡說八道。我僅僅只是說我想說的話 讓我在VRChat裡等你們,之後有空的話我也會拍我遊玩的影片到小破站 如果有想進一步了解Oculus Quest的,我這邊推薦一個專業的評測影片。 Oculus Quest VR 讓我們離「刀劍神域」「頭號玩家」還有多遠? https://www.youtube.com/watch?v=2z-QyogFp9o (如果能打開的話)

2020年9月18日 · 1 min · MoeJue

“垃圾佬”來了

出任CEO,迎娶白富美,走向人生巔峰. 的第一步是先買個伺服器 一個帶顯示卡的伺服器 主機板 記憶體條 CPU風扇 硬碟+CPU 後面就陸陸續續到了一些小部件,電源線、網路線、電錶之類的 等東西到的差不多了,就開始組裝、通電、開機 鍵盤、顯示器、裝機隨身碟都是借的,開完機就要還回去了 開機過程並不是很順利,持續了兩三個星期才算正常開機運行 為了應對停電關機、來電後無人開機的情況,買了個WiFi遠端開機模組,來電自動開機 後來我們為了應對停電,直接購買了全新的UPS,斷電保護,持續供電,電壓穩定,保護伺服器 之後由於配置跟不上了,我們又購入了新的CPU 和新的顯示卡 新的主機板 最後放入特製機箱 這可能就是你們使用的千萬級別數據的伺服器了 (-笑 目前伺服器已經正常不間斷運行數月

2020年8月18日 · 1 min · MoeJue

2020端午團隊旅遊

終於有時間出來發部落格了。 這個端午沒浪費,我們團隊一行人前往了惠州市雙月灣度過了2晚3日的愉快之旅 路上顛簸的行程不做概述………. 雙月灣觀景台,一大早吃完飯店提供的早餐,我們就向能俯瞰整個雙月灣的觀景台出發了。 騎上小黃車,在一路堵車的道路中隨意穿行,很快就來到了山腳下。由於海龜館人比較多,我們又沒有戴口罩,所以跳過這個景點,直接上山。 爬了好幾個小時的山,終於到了山頂 宛如兩個相對的彎彎月兒 山下的景色是不是很美?美你還花大把時間上來幹嘛。 小星山浮潛,租個小艇,一起出海,帶上裝備,潛入水底。………穿著救生衣帶著救生圈抓著救生員的我實在潛不下去…..嘎嘎嘎 遠海的小島邊上的水確實會比岸邊清澈不少 邊上的暗礁或者是叫石頭吧,讓我想起了《輕音少女》秋山澪,細看好恐怖…..啊…..啊 落日回程,海上欣賞落日風光 時不時喝一口海水,哇,鹹,呸呸呸 水珠在跳動 晚上,鮑魚龍蝦伺候 我們稱之為,鮑魚龍蝦局,彷彿聽到錢包在流血的聲音 突然發現,忘記拍夜景了,完蛋….. NB!!!!期待下一次旅行

2020年7月5日 · 1 min · MoeJue