<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
  <title>蜗牛大锅的博客</title>
  <link>http://threescard</link>
  <description>蜗牛大锅的博客</description>
  <copyright>蜗牛大锅的博客2013-2026</copyright>
  <lastBuildDate>2024-09-09 22:59:00</lastBuildDate>
  
    <item>
    <title>python序列化</title>
    <description><![CDATA[  <p><strong><span style="font-size:16px;">一、python序列化</span></strong></p>
<p>1、python序列化使用内置的pickle，<span>对象</span>可以序列化为字节或文件；</p>
<p>2、仅仅序列化json数据，或者限制反序列化类型，避免反序列化漏洞；</p>
<p><br />
</p>
<p>序列化示例：</p>
<p>data = {'name':'Alice', 'age':25, 'city':'New York'}<br />
#dump to json<br />
data_json = json.dumps(data)<br />
data = json.loads(data_json)<br />
#dump to byte<br />
data_bytes = pickle.dumps(data)<br />
data = pickle.loads(data_bytes)<br />
#dump to file<br />
with open('data.pickle', 'wb') as file:<br />
&nbsp; &nbsp; pickle.dump(data, file)<br />
with open('data.pickle', 'rb') as file:<br />
&nbsp; &nbsp; data = pickle.load(file)</p>
<p><br />
</p>
<p>解析序列化数据：</p>
<p>data = {'name':'Alice', 'age':25, 'city':'New York'}<br />
data_bytes = pickle.dumps(data)<br />
data = pickle.loads(data_bytes)<br />
pickletools.dis(data_bytes)</p>
<p><br />
</p>
<p>恶意反序列化：</p>
<p>class Malicious:<br />
&nbsp; &nbsp; def __reduce__(self):<br />
&nbsp; &nbsp; &nbsp; &nbsp; return (os.system, ('ls -al',))<br />
malicious_data = pickle.dumps(Malicious())<br />
pickle.loads(malicious_data)</p>
<p><br />
</p>
<p>反序列化类型限制：</p>
<p>permitTypes = {"str", "list", "dict", "set", "int", "float", "bool"}<br />
class RestrictedUnpickler(pickle.Unpickler):<br />
&nbsp; &nbsp; def find_class(self, module, name):<br />
&nbsp; &nbsp; &nbsp; &nbsp; if module == "builtins" and name in permitTypes:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return pickle.Unpickler.find_class(self, module, name)<br />
&nbsp; &nbsp; &nbsp; &nbsp; raise pickle.UnpicklingError(f"global {module}.{name} is forbidden")<br />
def restricted_loads(s):<br />
&nbsp; &nbsp; return RestrictedUnpickler(io.BytesIO(s)).load()</p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=391</link>
    <category>Python语言</category>
    <pubDate>2024-09-09 22:59:00 +0800</pubDate>
  </item>
    <item>
    <title>centos配置vsftp</title>
    <description><![CDATA[  <p><strong><span style="font-size:16px;">一、</span></strong><strong><span style="font-size:16px;">centos配置vsftp</span></strong></p>
<p>1、vsftp是最安全的ftp服务端；</p>
<p>2、filezilla-server是最方便的ftp服务端，<span>filezilla是最方便的ftp客户端</span>；</p>
<p>3、ftp将目录绑定给用户，用户即可访问该目录的文件，从而实现权限控制；</p>
<p>4、sshd支持sftp协议，使用sftp不需要额外安装服务；</p>
<p>5、数据传输主动模式：服务器通过20端口连接到客户端，进行数据传输；</p>
<p>6、<span>数据传输</span>被动模式：服务器开启大于等于1024的端口，客户端连接此端口，进行数据传输；</p>
<p>7、<span>读取目录列表失败，</span><span>配置</span><span>iptables导致模块被卸载，需要重新加载模块modprobe ip_nat_ftp；</span></p>
<p><span><br />
</span></p>
<p><span style="font-weight:700;">安装：</span></p>
<p>yum -y install vsftpd<br />
service vsftpd start<br />
chkconfig --level 35 vsftpd on</p>
<p><br />
</p>
<p><strong>配置/etc/vsftpd/vsftpd.conf：</strong></p>
<p>anonymous_enable=NO，禁止匿名登录<br />
xferlog_enable=YES，打开xferlog<br />
xferlog_file=/var/log/xferlog</p>
<p>chroot_local_user=YES，限制用户只能访问自己的目录<br />
chroot_list_enable=NO，禁止限制例外<br />
chroot_list_file=/etc/vsftpd/chroot_list</p>
<p>userlist_enable=YES，user_list文件内用户<span>禁止</span>登录</p>
<p><br />
</p>
<p><strong>创建用户：</strong></p>
<p>useradd ftpuser -d /home/ftproot/ftpuser -G nobody<br />
passwd ftpuser</p>
<p><br />
</p>
<p><strong>配置</strong><strong>/etc/sysconfig/iptables</strong><strong>：</strong></p>
<p>-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT<br />
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT<br />
-A INPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --dport 1024: -j ACCEPT</p>
<p>service iptables restart</p>
<p><br />
</p>
<p><span style="font-weight:700;">限制服务占用磁盘空间：</span></p>
<p>dd if=/dev/zero of=ftp.img bs=2M count=4096<br />
losetup /dev/loop0 ftp.img<br />
mkfs.ext4 /dev/loop0<br />
mkdir&nbsp;/home/ftproot<br />
mount /dev/loop0 /home/ftproot</p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=390</link>
    <category>网络</category>
    <pubDate>2019-08-14 10:14:00 +0800</pubDate>
  </item>
    <item>
    <title>rich终端富文本 pyqrcode生成二维码 qrcode生成二维码</title>
    <description><![CDATA[  <p><span style="font-size:16px;"><strong>一、<span>rich终端富文本</span></strong></span></p>
<p>1、代码仓库：<a href="https://github.com/Textualize/rich" target="_blank">https://github.com/Textualize/rich</a></p>
<p>2、帮助文档：<a href="https://rich.readthedocs.io/en/latest" target="_blank">https://rich.readthedocs.io/en/latest</a></p>
<p>3、rich安装：pip install rich</p>
<p><br />
</p>
<p>优雅输出：</p>
<p>from rich import print</p>
<p>from rich.pretty import pprint</p>
<p><br />
</p>
<p>优雅输出(<span>交互式场景</span>)：</p>
<p>from rich import pretty<br />
pretty.install()</p>
<p><br />
</p>
<p>优雅输出(复杂样式)：</p>
<p>from rich.console import Console<br />
console = Console()<br />
console.print("Hello", "World!", style="bold red")</p>
<p><br />
</p>
<p>优雅侦查：</p>
<p>from rich import inspect<br />
my_list = ["foo", "bar"]<br />
inspect(my_list, methods=True)</p>
<p><br />
</p>
<p><span style="font-weight:700;font-size:16px;">二、pyqrcode生成二维码</span></p>
<p>1、pyqrcode代码仓库：<a href="https://github.com/mnooner256/pyqrcode" target="_blank">https://github.com/mnooner256/pyqrcode</a></p>
<p><span>2、</span><span>pyqrcode安装：pip.exe install&nbsp;pyqrcode，pip.exe install pypng</span></p>
<p>3、<span>scale每个方块多少像素，<span>quiet_zone边缘有几个空白方块；</span></span></p>
<p><span>4、容错率：L=7%、M=15%、Q=25%、H=30%，容错率越高，空间利用率越低；</span></p>
<p><span>5、编码方式：numeric、alphanumeric、binary、kanji，单个字符所用比特递增；</span></p>
<p><span><span><span><br />
</span></span></span></p>
<p><span><span><span><span>代码示例：</span><br />
</span></span></span></p>
<p><span><span><span>import pyqrcode<br />
qr = pyqrcode.create('Some data', error='M', mode='binary')<br />
qr.png('some_file0.png', scale=10)<br />
qr.show(scale=10,quiet_zone=4)<br />
print(qr.terminal())<br />
</span></span></span></p>
<p><span><span><span><br />
</span></span></span></p>
<p><span><span><span><strong><span style="font-size:16px;">三、qrcode生成二维码（推荐使用）</span></strong></span></span></span></p>
<p><span><span><span></span></span></span></p>
<p>1、qrcode代码仓库：<a href="https://github.com/lincolnloop/python-qrcode" target="_blank">https://github.com/lincolnloop/python-qrcode</a></p>
<p>2、qrcode安装：pip.exe install&nbsp;"qrcode[pil]"</p>
<p>3、<span><span>box_size</span>每个方块多少像素，</span><span><span>border</span>边缘有几个空白方块；</span></p>
<p><br />
</p>
<p><span><span><span><span>代码示例：</span><br />
</span></span></span></p>
<p><span><span><span>import qrcode<br />
img = qrcode.make('Some data')<br />
img.save('some_file1.png')<br />
</span></span></span></p>
<p><span><span><span><br />
</span></span></span></p>
<p><span><span><span>配置参数：</span></span></span></p>
<p><span><span><span><span style="font-family:微软雅黑;">import qrcode</span><br />
</span></span></span></p>
<p><span><span><span>qr = qrcode.QRCode(version=1,box_size=10,border=4,<br />
&nbsp; &nbsp; error_correction=qrcode.constants.ERROR_CORRECT_M)<br />
qr.add_data('Some data')<br />
qr.make(fit=True)<br />
img = qr.make_image(fill_color='black', back_color='white')<br />
img.save('some_file2.png')<br />
</span></span></span></p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=389</link>
    <category>Python常用库</category>
    <pubDate>2025-11-15 22:28:00 +0800</pubDate>
  </item>
    <item>
    <title>python的struct模块处理二进制数据</title>
    <description><![CDATA[  <p><strong><span style="font-size:16px;">一、python的struct模块处理二进制数据</span></strong></p>
<p>对齐字符说明：</p>
<p>1、格式第一个字符指定字节序、大小、对齐策略；</p>
<p>2、第一个字符不是以下任一字符，默认为@字符；</p>
<p><span>3、native表示当前机器的大端小端；</span></p>
<p><img src="http://threescard/data/upload/201509/f_e56c640a9490cd67f309f8990c368dd2.jpg" alt="" /></p>
<p><br />
</p>
<p>数据字符说明：</p>
<p>1、数据字符前面加数字表示重复，比如'4i' = 'iiii'；</p>
<p>2、表达式中的空白字符被忽略，但数字和数据字符之间不能有空白；</p>
<p><img src="http://threescard/data/upload/201509/f_b85b489cc9fb38d49bbcd4a3252b00cf.jpg" alt="" /></p>
<p><br />
</p>
<p>打印字符串十六进制：</p>
<p><span style="line-height:1.57143;"></span></p>
<p><span style="line-height:1.57143;">def printHex(s):</span></p>
<p>&nbsp; &nbsp; for ch in s:<br />
&nbsp; &nbsp; &nbsp; &nbsp; print '0x%02x' % ord(ch),<br />
&nbsp; &nbsp; print</p>
<p><br />
</p>
<p><span style="font-size:14px;">pack转换为二进制数据：</span></p>
<p><span style="font-size:14px;"><span>1、计算数据长度，print struct.calcsize('ii')，输出8</span><br />
</span></p>
<p>2、转换整数，printHex(struct.pack('i', 1))，输出0x01 0x00 0x00 0x00</p>
<p>3、补齐，printHex(struct.pack('ixx', 1))，输出0x01 0x00 0x00 0x00 0x00 0x00</p>
<p>4、对齐，printHex(struct.pack('ic', 1, 'a'))，输出0x01 0x00 0x00 0x00 0x61</p>
<p><span>5、对齐，</span>printHex(struct.pack('ci', 'a', 1))，输出0x61 0x00 0x00 0x00 0x01 0x00 0x00 0x00</p>
<p><br />
</p>
<p><span style="font-size:14px;">unpack解析二进制数据：</span></p>
<p>1、print struct.unpack('i', struct.pack('i', 1))，输出(1,)</p>
<p>2、print struct.unpack('ci', struct.pack('ci', 'a', 1))，输出('a', 1)</p>
<p>3、print struct.unpack('3s', struct.pack('3s', 'abc'))，输出('abc',)</p>
<p><br />
</p>
<p>使用缓存转换数据：</p>
<p>buf = ctypes.create_string_buffer(100)<br />
struct.pack_into('i', buf, 1, 5)<br />
print struct.unpack_from('i', buf, 1)</p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=388</link>
    <category>Python语言</category>
    <pubDate>2015-09-04 15:53:00 +0800</pubDate>
  </item>
    <item>
    <title>oauth2.0使用介绍 oauthlib使用介绍 authlib使用介绍  pyjwt使用介绍</title>
    <description><![CDATA[  <p><span style="font-weight:700;"><span style="font-size:16px;">一、</span></span><span style="font-weight:700;"><span style="font-size:16px;">oauth2.0使用介绍</span></span></p>
<p>1、oauth规范：<a href="https://datatracker.ietf.org/doc/html/rfc6749" target="_blank">https://datatracker.ietf.org/doc/html/rfc6749</a></p>
<p><span>2、pkce规范：</span><span><a href="https://datatracker.ietf.org/doc/html/rfc7636" target="_blank">https://datatracker.ietf.org/doc/html/rfc7636</a></span></p>
<p><span>3、设备授权：</span><span><a href="https://datatracker.ietf.org/doc/html/rfc8628" target="_blank">https://datatracker.ietf.org/doc/html/rfc8628</a></span></p>
<p>4、<span>token</span>吊销：<a href="https://datatracker.ietf.org/doc/html/rfc7009" target="_blank">https://datatracker.ietf.org/doc/html/rfc7009</a></p>
<p>5、<span>token</span>内省：<a href="https://datatracker.ietf.org/doc/html/rfc7662" target="_blank">https://datatracker.ietf.org/doc/html/rfc7662</a></p>
<p><span>6、metadata：</span><a href="https://datatracker.ietf.org/doc/html/rfc8414" target="_blank">https://datatracker.ietf.org/doc/html/rfc8414</a></p>
<p>7、http认证：<a href="https://datatracker.ietf.org/doc/html/rfc2617" target="_blank">https://datatracker.ietf.org/doc/html/rfc2617</a></p>
<p>8、bearer认证：<a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank">https://datatracker.ietf.org/doc/html/rfc6750</a></p>
<p><br />
</p>
<p>oauth授权方式：</p>
<p>1、Authorization Code：授权码模式，用户授权才能访问资源，设备有浏览器，返回access_token，<span>返回</span>refresh_token；</p>
<p><span>2、</span><span>Device Authorization：设备码模式，用户授权才能访问资源，设备没有浏览器，</span><span>返回access_token，</span><span>返回</span><span>refresh_token；</span><span></span></p>
<p>3、Client Credentials：客户端凭证模式，无需用户授权访问资源，<span>返回access_token，不返回<span>refresh_token</span></span>；</p>
<p><br />
</p>
<p>oidc使用介绍：</p>
<p>1、oidc规范：<a href="https://openid.net/specs/openid-connect-core-1_0.html" target="_blank">https://openid.net/specs/openid-connect-core-1_0.html</a></p>
<p>2、多个响应类型：<a href="https://openid.net/specs/oauth-v2-multiple-response-types-1_0.html" target="_blank">https://openid.net/specs/oauth-v2-multiple-response-types-1_0.html</a></p>
<p>3、认证策略扩展：<a href="https://openid.net/specs/openid-provider-authentication-policy-extension-1_0.html" target="_blank">https://openid.net/specs/openid-provider-authentication-policy-extension-1_0.html</a></p>
<p>4、认证方法引用：<a href="https://datatracker.ietf.org/doc/html/rfc8176" target="_blank">https://datatracker.ietf.org/doc/html/rfc8176</a></p>
<p>5、oidc认证用户成功，返回一个签名的id_token，包含认证用户的信息；</p>
<p>6、id_token必填字段：iss签发者、sub用户标识、aud客户端ID、exp过期时间、iat签发时间；</p>
<p><span>7、id_token可选字段：</span>auth_time认证时间、nonce随机值、acr认证等级、amr认证方法、azp认证客户端；</p>
<p><br />
</p>
<p><strong><span style="font-size:16px;">二、oauthlib使用介绍</span></strong></p>
<p>1、oauthlib代码仓库：<a href="https://github.com/oauthlib/oauthlib" target="_blank">https://github.com/oauthlib/oauthlib</a></p>
<p>2、oauthlib代码仓库：<a href="https://github.com/requests/requests-oauthlib" target="_blank">https://github.com/requests/requests-oauthlib</a></p>
<p>3、oauthlib帮助文档：<a href="https://oauthlib.readthedocs.io/en/latest" target="_blank">https://oauthlib.readthedocs.io/en/latest</a></p>
<p>4、oauthlib帮助文档：<a href="https://requests-oauthlib.readthedocs.io/en/latest" target="_blank">https://requests-oauthlib.readthedocs.io/en/latest</a></p>
<p>5、oauthlib安装：pip install oauthlib</p>
<p>6、oauthlib安装：pip install requests requests-oauthlib</p>
<p><span>7、</span><span>OAuth2Session.fetch_token会根据</span><span>expires_in</span><span>计算</span><span>expires_at</span></p>
<p><span>8、<span>OAuth2Session.</span>refresh_token<span>会根据</span><span>expires_in</span><span>计算</span><span>expires_at</span></span></p>
<p><span><span>09、服务端验证器：服务端需要实现RequestValidator，用于验证客户端的请求；</span></span></p>
<p><span><span>10、服务端验证器示例：<span style="font-size:12px;"><a href="https://github.com/oauthlib/oauthlib/blob/master/examples/skeleton_oauth2_web_application_server.py" target="_blank"><span style="font-size:11px;">https://github.com/oauthlib/oauthlib/blob/master/examples/skeleton_oauth2_web_application_server.py</span></a></span></span></span></p>
<p>11、<span>协议外自定义验证：<span>RequestValidator之外增加额外校验，pre_auth, post_auth，pre_token, post_token<span>；</span></span></span></p>
<p>12、协议外自定义验证：<a href="https://oauthlib.readthedocs.io/en/latest/oauth2/grants/custom_validators.html" target="_blank">https://oauthlib.readthedocs.io/en/latest/oauth2/grants/custom_validators.html</a></p>
<p>13、自定义授权：<a href="https://oauthlib.readthedocs.io/en/latest/oauth2/grants/custom_grant.html" target="_blank">https://oauthlib.readthedocs.io/en/latest/oauth2/grants/custom_grant.html</a></p>
<p>14、自定义token：<span>WebApplicationServer的token_generator用于自定义token生成器；</span></p>
<p><span><br />
</span></p>
<p>oauthlib授权码模式：</p>
<p>1、常用参数：client_id、client_secret、<span>redirect_uri、</span>scope、state</p>
<p>2、资源服务重定向到授权服务：OAuth2Session.authorization_url</p>
<p>3、授权服务返回授权码：Server.create_authorization_response</p>
<p>4、资源服务请求token：<span>OAuth2Session.fetch_token</span></p>
<p><span>5、授权服务返回token：<span>Server.</span>create_token_response</span></p>
<p><span>6、<span>资源服务携带token请求：</span>OAuth2Session.get</span></p>
<p><span>7、<span>资源服务<span>携带</span>token请求：</span><span></span><span>OAuth2Session.post</span></span></p>
<p><br />
</p>
<p><span>oauthlib授权码模式+pkce：</span></p>
<p>1、<span>常用参数：client_id、<span>code_verifier、</span>code_challenge、redirect_uri、<span>scope、</span>state</span></p>
<p><span></span></p>
<p>2、资源服务重定向到授权服务：OAuth2Session.authorization_url</p>
<p>3、授权服务返回授权码：Server.create_authorization_response</p>
<p>4、资源服务请求token：OAuth2Session.fetch_token</p>
<p>5、授权服务返回token：Server.create_token_response</p>
<p>6、资源服务携带token请求：OAuth2Session.get</p>
<p>7、资源服务携带token请求：OAuth2Session.post</p>
<p><br />
</p>
<p>oauthlib设备码模式：</p>
<p>1、常用参数：client_id、client_secret、device_code、user_code、verification_uri、scope</p>
<p>2、requests-oauthlib不支持设备码模式，客户端需要使用<span>requests + <span>oauthlib的</span></span>DeviceClient自行实现；</p>
<p><br />
</p>
<p>oauthlib<span style="font-family:微软雅黑;">客户端凭证模式：</span></p>
<p><span style="font-family:微软雅黑;">1、常用参数：<span>client_id、client_secret、scope</span></span></p>
<p><span style="font-family:微软雅黑;"></span></p>
<p>2、资源服务请求token：OAuth2Session.fetch_token</p>
<p>3、授权服务返回token：Server.create_token_response</p>
<p>4、资源服务携带token请求：OAuth2Session.get</p>
<p>5、资源服务携带token请求：OAuth2Session.post</p>
<p><br />
</p>
<p><strong><span style="font-size:16px;">三、authlib使用介绍</span></strong></p>
<p>1、authlib代码仓库：<a href="https://github.com/authlib/authlib" target="_blank">https://github.com/authlib/authlib</a></p>
<p>2、authlib帮助文档：<a href="https://docs.authlib.org/en/stable" target="_blank">https://docs.authlib.org/en/stable</a></p>
<p>3、authlib安装：pip install Authlib</p>
<p><br />
</p>
<p><strong><span style="font-size:16px;">四、</span></strong><strong><span style="font-size:16px;">pyjwt使用介绍</span></strong></p>
<p>1、jwt在线规范：<a href="https://datatracker.ietf.org/doc/html/rfc7519" target="_blank">https://datatracker.ietf.org/doc/html/rfc7519</a></p>
<p>2、jwt公共字段：<a href="https://www.iana.org/assignments/jwt/jwt.xhtml" target="_blank">https://www.iana.org/assignments/jwt/jwt.xhtml</a></p>
<p>3、<span>pyjwt</span>代码仓库：<a href="https://github.com/jpadilla/pyjwt" target="_blank">https://github.com/jpadilla/pyjwt</a></p>
<p>4、<span>pyjwt</span><span>帮助文档：</span><a href="https://pyjwt.readthedocs.io/en/stable" target="_blank">https://pyjwt.readthedocs.io/en/stable</a></p>
<p><span>5、jwt格式：<span>base64(header).</span><span>base64(payload).base64(sign)</span></span></p>
<p>6、jwt字段：注册字段、公共字段、私有字段；</p>
<p>7、<span>jwt</span>字段：注册字段是在规范里面的公共字段；</p>
<p><span>8、安装依赖：pip install pyjwt</span></p>
<p><span><br />
</span></p>
<p><span>使用详解：</span></p>
<p><span><span></span></span></p>
<p>1、无校验获取头部：jwt.get_unverified_header(encoded)</p>
<p>2、无校验解码：jwt.decode(encoded, options={"verify_signature": False})</p>
<p><span><span></span><span>3、校验解码(返回payload)：jwt.decode(encoded, key, algorithms="HS256")</span><br />
</span></p>
<p><span>4、校验解码<span>(返回全部)：</span>jwt.decode_complete(encoded, key, algorithms="HS256")<br />
</span></p>
<p><br />
</p>
<p>计算哈希：</p>
<p>algo = jwt.get_algorithm_by_name("HS256")<br />
hash = algo.compute_hash_digest("data".encode())<br />
print(hash)</p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=387</link>
    <category>Python常用库</category>
    <pubDate>2025-11-08 23:19:00 +0800</pubDate>
  </item>
    <item>
    <title>SDD规范驱动编程 扩展工作流程</title>
    <description><![CDATA[  <p><strong><span style="font-size:16px;">一、SDD规范驱动编程</span></strong></p>
<p>1、openspec：<a href="https://github.com/Fission-AI/OpenSpec" target="_blank">https://github.com/Fission-AI/OpenSpec</a>，比较简单，推荐使用；</p>
<p>2、speckit：<a href="https://github.com/github/spec-kit" target="_blank">https://github.com/github/spec-kit</a>，交付文件较多，适合大项目；</p>
<p>3、openspec安装：<span>npm install -g @fission-ai/openspec@latest</span></p>
<p><span>4、openspec配置：setx OPENSPEC_TELEMETRY 0</span></p>
<p><span><br />
</span></p>
<p>帮助文档：</p>
<p>1、终端命令：<a href="https://github.com/Fission-AI/OpenSpec/blob/main/docs/cli.md" target="_blank">https://github.com/Fission-AI/OpenSpec/blob/main/docs/cli.md</a></p>
<p>2、插件命令：<a href="https://github.com/Fission-AI/OpenSpec/blob/main/docs/commands.md" target="_blank">https://github.com/Fission-AI/OpenSpec/blob/main/docs/commands.md</a></p>
<p><span>3、入门帮助：<a href="https://github.com/Fission-AI/OpenSpec/blob/main/docs/getting-started.md" target="_blank">https://github.com/Fission-AI/OpenSpec/blob/main/docs/getting-started.md</a></span></p>
<p><span><span>4、工作流程：</span><a href="https://github.com/Fission-AI/OpenSpec/blob/main/docs/workflows.md" target="_blank">https://github.com/Fission-AI/OpenSpec/blob/main/docs/workflows.md</a><br />
</span></p>
<p><span>5、详细帮助：<a href="https://github.com/Fission-AI/OpenSpec/blob/main/docs/opsx.md" target="_blank">https://github.com/Fission-AI/OpenSpec/blob/main/docs/opsx.md</a></span></p>
<p><br />
</p>
<p>常用命令：</p>
<p>1、初始化项目：openspec init</p>
<p>2、更新项目插件：openspec update</p>
<p>3、查看变更列表：openspec list</p>
<p>4、查看变更详情：openspec view</p>
<p>5、查看变更内容：openspec show</p>
<p>6、验证变更内容：openspec validate</p>
<p><br />
</p>
<p><span>初始化项目：</span></p>
<p>cd project<br />
openspec init</p>
<p><span>openspec\</span><span>config.yaml</span>：</p>
<p>context: |<br />
&nbsp; 语言：中文（简体）<br />
&nbsp; 所有产出物必须用简体中文撰写。</p>
<p><br />
</p>
<p>核心流程：<span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);"></span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);"><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">1、/opsx:explore [topic]</span><br />
</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">2、/opsx:propose [change-name-or-description]</span><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);"></span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">3、/opsx:apply [change-name]</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">4、/opsx:archive [change-name]</span><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);"></span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);"><br />
</span></p>
<p><span style="font-size:16px;"><strong>二、扩展工作流程</strong></span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">1、扩展工作流程是全局配置，所有项目生效；</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">2、扩展工作流程：openspec config profile<br />
3、更新项目插件：openspec update</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);"><br />
</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">扩展流程：</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">1、/opsx:new [change-name]</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">2、/opsx:continue [change-name]</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">3、/opsx:ff [change-name]</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);"></span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">4、/opsx:apply [change-name]</span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">5、/opsx:verify <span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">[change-name]</span></span></p>
<p><span style="color:#1F2328;font-family:ui-monospace, SFMono-Regular, &quot;font-size:13.6px;background-color:rgba(129, 139, 152, 0.12);">6、/opsx:archive [change-name]</span></p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=386</link>
    <category>人工智能</category>
    <pubDate>2026-03-02 23:03:00 +0800</pubDate>
  </item>
    <item>
    <title>claude-api使用介绍</title>
    <description><![CDATA[  <p><strong><span style="font-size:16px;">一、claude-api使用介绍</span></strong></p>
<p>1、入门帮助：<a href="https://platform.claude.com/docs/en/get-started" target="_blank">https://platform.claude.com/docs/en/get-started</a></p>
<p>2、发送消息示例：<a href="https://platform.claude.com/docs/en/build-with-claude/working-with-messages" target="_blank">https://platform.claude.com/docs/en/build-with-claude/working-with-messages</a></p>
<p><span>3、上传文件示例：</span><a href="https://platform.claude.com/docs/en/build-with-claude/files" target="_blank">https://platform.claude.com/docs/en/build-with-claude/files</a></p>
<p>4、结构化输出：<a href="https://platform.claude.com/docs/en/build-with-claude/structured-outputs" target="_blank">https://platform.claude.com/docs/en/build-with-claude/structured-outputs</a></p>
<p>5、发送消息支持：basic单条消息，multiple多轮对话，p<span>refill</span>预填充结果，vision解析图片；</p>
<p>6、输出结果约束：<span>prefill</span><span>预填充结果，s<span>tructured-output</span>结构化输出，s<span>ystem</span>系统提示词；</span></p>
<p><span>7、安装依赖：pip install anthropic</span></p>
<p><br />
</p>
<p>使用工具：</p>
<p>1、工具概况：<a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview" target="_blank">https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview</a></p>
<p>2、工具原理：<a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works" target="_blank">https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works</a></p>
<p>3、<span>工具调用</span>：<a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/build-a-tool-using-agent" target="_blank">https://platform.claude.com/docs/en/agents-and-tools/tool-use/build-a-tool-using-agent</a></p>
<p>4、<span>工具开发：<a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools" target="_blank">https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools</a></span></p>
<p>5、工具分类：User-defined用户自定义工具，Anthropic-schema客户端内置工具，Server-executed服务端执行工具；</p>
<p><span>6、</span><span>工具配置：</span><span>defer_loading延迟加载，allowed_callers限制调用方，<span>strict严格校验模式，</span><span>cache_control缓存调用结果</span><span></span><span>；</span></span></p>
<p><br />
</p>
<p><span>发送消息接口：</span><a href="https://platform.claude.com/docs/en/api/python/messages/create" target="_blank">https://platform.claude.com/docs/en/api/python/messages/create</a></p>
<p><span>发送消息接口：</span>messages.create(**kwargs) -&gt; Message</p>
<p>1、max_tokens，最大生成多少token，防止消耗过多token；</p>
<p>2、messages，消息内容，消息数组主要是为了支持上下文；</p>
<p><span>3、system，系统提示词，不设置时使用默认的系统提示词；</span></p>
<p>4、output_config，设置努力级别，设置输出格式schema；</p>
<p>5、stop_sequences，生成的内容出现这些字符串，生成立即停止；</p>
<p>6、tool_choice，控制模型如何使用工具，比如必须调用指定工具；</p>
<p>7、tools，定义模型可以调用的工具列表，允许调用的工具列表；</p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=385</link>
    <category>人工智能</category>
    <pubDate>2026-02-18 21:18:00 +0800</pubDate>
  </item>
    <item>
    <title>搜索引擎技巧 网站强制更新 分页原理 实体编码 验证码作用 识别验证码</title>
    <description><![CDATA[  <p><span style="font-size:16px;font-weight:700;">一、搜索引擎技巧</span></p>
<p>1、<span>搜索</span>指定站点site:domain 关键字，<span>搜索</span>指定文件类型filetype:pdf 关键字；</p>
<p>2、robots.txt文件用于告诉搜索引擎可以访问哪些文件，不可以访问哪些文件；</p>
<p><br />
</p>
<p><strong><span style="font-size:16px;">二、网站强制更新</span></strong></p>
<p>1、前端页面编码当前服务版本；</p>
<p>2、后端提供接口获取当前服务版本；</p>
<p>3、比对前端版本和后端版本，不一致则强制更新windows.location.reload(true)；</p>
<p><br />
</p>
<p><span style="font-weight:700;"><span style="font-size:16px;">三、分页原理</span></span></p>
<p>1、首页查询：查询数据总量和首页数据；</p>
<p>2、换页查询：基于前一页的数据索引查询换页数据；</p>
<p>3、分页排序：可以后端全局排序，可以前端局部排序；</p>
<p><br />
</p>
<p><span style="font-weight:700;"><span style="font-size:16px;">四、实体编码</span></span></p>
<p>1、实体编码用于输出某些无法做为普通文本显示的字符；</p>
<p>2、实体编码支持实体名称、十进制实体编号、十六进制实体编号；</p>
<p>3、比如双引号可以编码：&amp;quot; &amp;#34; &amp;#x22;</p>
<p>4、BurpSuite编解码工具支持实体编码转换；</p>
<p><span>5、</span><span>org.springframework.web.util.</span><span>HtmlUtils</span><span>支持实体编码转换；</span></p>
<p><br />
</p>
<p>实体编码：</p>
<p><span>1、&lt;：&amp;lt;</span><br />
<span>2、&gt;：&amp;gt;</span><br />
<span>3、&amp;：&amp;amp;</span></p>
<p>4、空格：&amp;nbsp;<br />
5、双引号：&amp;quot;<br />
6、单引号：&amp;apos;</p>
<p><br />
</p>
<p><span style="font-size:16px;font-weight:700;">五、验证码作用</span></p>
<p>验证码作用：</p>
<p>1、验证码可以在真正操作之前进行一次校验，防止暴力攻击比较有效；</p>
<p>2、如果验证码能够破解，但比较困难，可以<span>在验证码验证失败时刷新；</span></p>
<p><span>3、如果验证码非常容易破解，这个时候只能借助频控防止暴力攻击；</span></p>
<p><br />
</p>
<p>验证码原理：</p>
<p>1、后台生成4位随机码，包含字母和数字，并写入会话；</p>
<p>2、使用随机码生成图片返回给前端展示，需要使用彩色图片；</p>
<p>3、验证成功之后验证码失效，验证失败之后验证码仍然有效，频繁失效验证码会导致性能问题；</p>
<p><br />
</p>
<p><strong><span style="font-size:16px;">六、</span></strong><strong><span style="font-size:16px;">tesseract<span style="font-weight:700;"><span style="font-size:16px;">识别</span></span>验证码</span></strong></p>
<p>1、官方网址：<a href="https://github.com/tesseract-ocr/tesseract" target="_blank">https://github.com/tesseract-ocr/tesseract</a></p>
<p>2、win命令行：<a href="https://github.com/UB-Mannheim/tesseract/wiki" target="_blank">https://github.com/UB-Mannheim/tesseract/wiki</a></p>
<p>3、win图形界面：<a href="https://github.com/manisandro/gImageReader" target="_blank">https://github.com/manisandro/gImageReader</a></p>
<p>4、<span>识别</span>文字：tesseract imagename -，输出到命令行</p>
<p><span>5、<span>识别</span><span>文字：</span>tesseract imagename&nbsp;</span><span>outputbase，输出到文件</span><span></span></p>
<p><span><br />
</span></p>
<p><strong><span style="font-size:16px;">七、ddddocr识别验证码</span></strong></p>
<p>1、官网地址：<a href="https://github.com/sml2h3/ddddocr" target="_blank">https://github.com/sml2h3/ddddocr</a></p>
<p>2、包含两套模型，默认使用旧模型，通过<span>beta=True切换到新模型；</span></p>
<p><span>3、ocr.set_ranges(int|str)设置识别字符集，int是内置字符集，str是自定义字符集；</span></p>
<p><br />
</p>
<p>识别示例：</p>
<p>import ddddocr<br />
ocr = ddddocr.DdddOcr(beta=True)<br />
image = open("example.jpg", "rb").read()<br />
result = ocr.classification(image)<br />
print(result)</p>
<p><br />
</p>
<p>限定识别字符集：</p>
<p>import ddddocr<br />
ocr = ddddocr.DdddOcr(beta=True)<br />
ocr.set_ranges('ABCDEFG')<br />
image = open("example.jpg", "rb").read()<br />
result = ocr.classification(image, probability=True)<br />
s = ''<br />
for i in result['probability']:<br />
&nbsp; &nbsp; s += result['charsets'][i.index(max(i))]<br />
print(s)</p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=384</link>
    <category>WEB前端</category>
    <pubDate>2020-03-05 20:50:00 +0800</pubDate>
  </item>
    <item>
    <title>claude工具扩展 hook使用介绍</title>
    <description><![CDATA[  <p><strong><span style="font-size:16px;">一、hook使用介绍</span></strong></p>
<p>1、入门指引：<a href="https://code.claude.com/docs/zh-CN/hooks-guide" target="_blank">https://code.claude.com/docs/zh-CN/hooks-guide</a></p>
<p>2、使用参考：<a href="https://code.claude.com/docs/zh-CN/hooks" target="_blank">https://code.claude.com/docs/zh-CN/hooks</a></p>
<p>3、</p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=383</link>
    <category>人工智能</category>
    <pubDate>2026-02-15 19:37:00 +0800</pubDate>
  </item>
    <item>
    <title>claude工具扩展 mcp使用介绍 chrome-devtools-mcp使用介绍</title>
    <description><![CDATA[  <p><strong><span style="font-size:16px;">一、mcp使用介绍</span></strong></p>
<p>1、官方帮助：<a href="https://code.claude.com/docs/zh-CN/mcp" target="_blank">https://code.claude.com/docs/zh-CN/mcp</a></p>
<p>2、列出mcp：claude mcp list</p>
<p>3、查询mcp：claude mcp get <span>&lt;name&gt;</span></p>
<p>4、增加http服务器：claude mcp add --transport http &lt;name&gt; &lt;url&gt;</p>
<p>5、<span>增加</span>sse<span>服务器</span>：claude mcp add --transport sse &lt;name&gt; &lt;url&gt;</p>
<p>6、<span>增加</span>stdio<span>服务器</span>：claude mcp add [options] &lt;name&gt; "--" &lt;command&gt; [args...]</p>
<p>7、<span>增加</span><span>stdio</span><span>服务器：</span>windows上面nxp命令需要使用cmd /c执行；</p>
<p>8、自身作为mcp：claude mcp serve</p>
<p><br />
</p>
<p>mcp配置：</p>
<p>1、安装范围：本地范围，-s local，存储在~/.claude.json，项目内使用，默认安装范围；</p>
<p>2、<span>安装范围：</span>项目范围，-s project，存储在$project/.mcp.json，项目内使用，提交到仓库；</p>
<p><span>3、<span>安装范围：</span>用户范围，-s user，</span><span>存储在</span><span>~/.claude.json，所有项目使用；</span></p>
<p><span>4、安装范围：同名服务的优先级，本地范围 &gt; 项目范围 &gt; 用户范围；</span></p>
<p><span>5、本地禁用：/mcp进行禁用，</span><span>存储在</span><span>~/.claude.json，项目内禁用；</span></p>
<p><span>6、MCP_TIMEOUT：服务启动超时时间设置；</span></p>
<p><span>7、MAX_MCP_OUTPUT_TOKENS：单次请求最大输出令牌；</span></p>
<p><span><br />
</span></p>
<p><strong><span style="font-size:16px;">二、</span></strong><span style="font-size:16px;"><strong>chrome-devtools-mcp使用介绍</strong></span></p>
<p><span>1、代码仓库：<a href="https://github.com/ChromeDevTools/chrome-devtools-mcp" target="_blank">https://github.com/ChromeDevTools/chrome-devtools-mcp</a><br />
</span></p>
<p><span>2、使用帮助：<a href="https://www.npmjs.com/package/chrome-devtools-mcp" target="_blank">https://www.npmjs.com/package/chrome-devtools-mcp</a></span></p>
<p><span>3、<span>puppeteer仓库</span>：<a href="https://github.com/puppeteer/puppeteer" target="_blank">https://github.com/puppeteer/puppeteer</a></span></p>
<p><span>4、<span>puppeteer帮助：</span><a href="https://pptr.dev/category/introduction" target="_blank">https://pptr.dev/category/introduction</a></span></p>
<p><span>5、功能介绍：操控chrome，支持自动化、深入测试、<span>分析</span>性能；</span></p>
<p><span></span></p>
<p>6、实现原理：使用puppeteer自动化，使用devtools分析性能；</p>
<p>7、实现原理：snapshot工具读取网页结构，生成a11y tree，标识网页每个元素，用于后续自动化操作；</p>
<p><span>8、安装mcp：claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest</span></p>
<p><span><br />
</span></p>
<p><span><span>命令参数：</span></span></p>
<p>1、--autoConnect，自动连接已开启调试的浏览器；<br />
2、--browserUrl，自动连接已开启调试的远程浏览器；</p>
<p>3、--wsEndpoint，自动连接已开启调试的远程浏览器；</p>
<p>4、--headless，无头模式，没有用户界面的模式；</p>
<p><span>5、--isolated，隔离模式，使用临时的用户数据目录，浏览器退出时自动清理；</span></p>
<p>6、--userDataDir，用户数据目录，默认位于%USERPROFILE%\.cache\chrome-devtools-mcp\chrome-profile</p>
<p><br />
</p>
<p><span>工具介绍：</span></p>
<p>1、navigate_page，跳转到一个网址；</p>
<p>2、close_page，关闭一个指定的页面；</p>
<p><span>3、list_pages，列出目前打开的页面；</span></p>
<p>4、wait_for(text, timeout)，等待页面出现指定的文字；</p>
<p>5、evaluate_script(function, args)，当前页面执行脚本；</p>
<p>6、get_network_request(reqid)，查询一个网络请求，返回内容：请求头、请求体、返回头、返回体；</p>
<p><span>7、</span><span>list_network_requests(resourceTypes)，列出页面产生的所有网络请求，默认返回所有资源请求；</span></p>
<p><span><br />
</span></p>
<p><span>常用资源类型：</span></p>
<p>["document", "script",<br />
&nbsp;"xhr","fetch","other",<br />
&nbsp;"eventsource", "websocket"]</p>
<p><br />
</p>
<p><span>chrome通信协议：</span></p>
<p><span><span>1、CDP：Chrome DevTools Protocol，基于WebSocket的JSON-RPC协议；</span></span></p>
<p><span><span><span><span>2、CDP：</span><span>puppeteer和devtools使用CDP与浏览器通信，puppeteer简化了使用CDP</span><span>；</span></span></span></span></p>
<p><span><span><span><span></span></span></span></span></p>
<p>3、CDP：--remote-debugging-port<span>传输层</span>使用TCP，<span>--remote-debugging-pipe<span>传输层</span>使用管道；</span></p>
<p><span></span></p>
<p><span>4、扩展API：Chrome Extension API，浏览器的内部组件，运行在浏览器内部，效率非常高；</span></p>
<p>5、扩展API：扩展程序使用Chrome Extension API与浏览器通信，其核心是chrome.runtime；</p>
<p><span>6、Electron：Node.js + Chromium，<span>前者是主进程</span>，后者<span>是渲染进程，渲染进程实现UI渲染和交互；</span></span></p>
<p><span>7、<span>Electron：主进程和渲染进程之间使用IPC机制通信；</span></span></p>]]></description>
    <link>http://threescard/index.php?m=blog&amp;f=view&amp;id=382</link>
    <category>人工智能</category>
    <pubDate>2026-02-01 16:43:00 +0800</pubDate>
  </item>
  </channel>
</rss>
