W3c.Group 社区中文名官宣

W3协作组(Web3.0 Collaborative Group)是一个区块链驱动的创造者协作社区。使命是让小组成员共同创造价值,共建信任并获益。链上转账等功能由 Mixin Network 强力驱动。

W3协作组

W3协作组 的域名 w3c.group 含义为 web3 collaborative group,W3协作组的战略核心由原先的内容转向协作并实践MTG。使命是让小组成员共同创造价值,共建信任并获益。

除了修改中文名称和介绍外,还修改了合作伙伴和里程碑,接下来会推出正式的白皮书。

里程碑

    • 2019.01.02:立项、调研、设计、正式启动开发

    • 2019.06.14:顺利完成初版并正式上线,创建 “反馈讨论组” 小组 id 为 1123124

    • 2019.09.18:活跃于社区运营并持续迭代调整,正式接入 Mixin Network 进行积分和 WGT 存证

    • 2019.10.08:最终定调为创作者社区,并且确定 “协作” 为 W3c.Group 的核心方向

    • 2019.11.21:发布 “W3C创作者社区详细用户指南” ,明确 W3c.Group 含义为 Web3.0 Content Group

    • 2020.01.23:调整支持投票积分奖励方案,鼓励高质量创作者输出内容

    • 2020.07.20:立项 W3c.Market,进入开发阶段

    • 2020.09.28:W3c.Market 进入内测阶段,并启用推广独立域名 qdzdm.com

    • 2020.10.13:W3C 商城的重要营销工具“降价拍”,以独立 Mixin 机器人形式发布

    • 2020.10.14:确定中文名为 “W3协作组”,战略核心由内容转向协作并实践MTG,Web3 Collaborative Group(Ethereum存证:0xff06e8b3bf7c12e77e2182f165f503d68ef73e337100697a947f5f9304eb84cf)

即将正式发布初版白皮书...

另外,正在计划招募社区核心成员,毕竟百废待兴,正是缺人的时候!
欢迎有意向者提前私聊 Mixin ID: 916716。我们共建信任,协作创造价值!

with ware_class AS( SELECT tp.Code, GROUP_CONCAT(tm.Name ORDER BY tm.Level ASC SEPARATOR '/') AS classname FROM b2b_oms.tpro_mallcategory tm LEFT JOIN b2b_oms.tpro_productmallcategory tpm ON tm.Id = tpm.mallcategoryId LEFT JOIN b2b_oms.tpro_product tp ON tpm.ProductId = tp.Id WHERE tpm.AreaId = 3286299645965762560 AND tp.IsDeleted = 0 AND tm.IsDeleted = 0 AND tpm.IsDeleted = 0 GROUP BY tp.Code) with sales_30 AS( SELECT f.`SkuCode` AS '商品编码', SUM(b.`Qty`) AS '出库30总数量' FROM b2b_wms.st_outstockorder a LEFT JOIN b2b_wms.st_outstockorderitem b ON a.`Id` = b.`OutStockOrderId` LEFT JOIN b2b_wms.st_warehouse c ON a.`WarehouseId` = c.`Id` LEFT JOIN b2b_wms.st_warefield d ON b.`WareFieldId` = d.`Id` LEFT JOIN b2b_wms.st_wareposition e ON b.`WarePositionId` = e.`Id` LEFT JOIN b2b_wms.st_wares f ON b.`WaresId` = f.`Id` LEFT JOIN b2b_wms.st_userprofile g ON a.`Creator` = g.`UserName` LEFT JOIN b2b_wms.st_outstockorderitemhis h ON b.`Id` = h.`OutStockOrderItemId` AND a.`Id` = h.`OutStockOrderId` LEFT JOIN b2b_wms.st_userprofile i ON h.`ReviewUser` = i.`UserName` WHERE a.`TenantId` IN ( '3286299645965762560', '3131897506372599808' ) AND a.`WarehouseId` IN ( '3370028676427628544', '3353714265942151168' ) AND a.`Status` = 3 AND a.`Type` = 1 AND d.X4 = 0 AND a.`CreateTime` >= DATE_SUB(NOW(),INTERVAL 30 DAY) GROUP BY f.`SkuCode` ) WITH sales_90 AS( SELECT f.`SkuCode` AS '商品编码', SUM(b.`Qty`) AS '出库90总数量' FROM b2b_wms.st_outstockorder a LEFT JOIN b2b_wms.st_outstockorderitem b ON a.`Id` = b.`OutStockOrderId` LEFT JOIN b2b_wms.st_warehouse c ON a.`WarehouseId` = c.`Id` LEFT JOIN b2b_wms.st_warefield d ON b.`WareFieldId` = d.`Id` LEFT JOIN b2b_wms.st_wareposition e ON b.`WarePositionId` = e.`Id` LEFT JOIN b2b_wms.st_wares f ON b.`WaresId` = f.`Id` LEFT JOIN b2b_wms.st_userprofile g ON a.`Creator` = g.`UserName` LEFT JOIN b2b_wms.st_outstockorderitemhis h ON b.`Id` = h.`OutStockOrderItemId` AND a.`Id` = h.`OutStockOrderId` LEFT JOIN b2b_wms.st_userprofile i ON h.`ReviewUser` = i.`UserName` WHERE a.`TenantId` IN ( '3286299645965762560', '3131897506372599808' ) AND a.`WarehouseId` IN ( '3370028676427628544', '3353714265942151168' ) AND a.`Status` = 3 AND a.`Type` = 1 AND d.X4 = 0 AND a.`CreateTime` >= DATE_SUB(NOW(),INTERVAL 90 DAY) GROUP BY f.`SkuCode` ) SELECT t.'仓库名称', t.'库区', t.'库位', t.'商品编码', t.'商品名称', t.'商品条码', t.'单位', t.'规格',wc.classname AS '商品分类', SUM(t.'库存数量') AS '库存总数量', (SUM(t.'库存数量') / ((w3.'出库30总数量' + w9.'出库90总数量') / 2) * 30) AS '周转天数', SUM(t.'库存金额') AS '库存总金额', t.'分拣类型' FROM ( SELECT CONCAT(c.`Name`, c.`Code`) AS '仓库名称', CASE WHEN e.`X4` = 0 THEN CONCAT('分拣区', e.`Code`) ELSE '其他' END AS '库区', d.`Code` AS '库位', f.`SkuCode` AS '商品编码', f.`SkuName` AS '商品名称', f.`Barcode` AS '商品条码', f.`Unit` AS '单位', SUBSTRING(f.`Subtitle`, 1, 5) AS '规格', b.`Qty` AS '库存数量', b.`Amount` AS '库存金额', CASE WHEN a.`FnType` = 3 THEN '拆零' WHEN a.`FnType` = 1 THEN '整件' ELSE '其他' END AS '分拣类型' FROM b2b_wms.st_warestore a LEFT JOIN b2b_wms.st_warestoreitem b ON a.Id = b.`WareStoreId` LEFT JOIN b2b_wms.st_warehouse c ON a.`WarehouseId` = c.`Id` LEFT JOIN b2b_wms.st_wareposition d ON b.`WarePositionId` = d.`Id` LEFT JOIN b2b_wms.st_warefield e ON d.`WareFieldId` = e.`Id` AND d.`WarehouseId` = e.`WarehouseId` LEFT JOIN b2b_wms.st_wares f ON a.`WaresId` = f.`Id` WHERE a.`TenantId` IN ( '3286299645965762560', '3131897506372599808' ) AND a.`WarehouseId` IN ( '3370028676427628544', '3353714265942151168' ) AND b.`Qty` > 0 AND e.`X4` = 0 ) t LEFT JOIN ware_class wc ON t.'商品编码' = wc.CODE LEFT JOIN wares_30 w3 ON t.'商品编码' = w3.'商品编码' LEFT JOIN wares_90 w9 ON t.'商品编码' = w9.'商品编码' GROUP BY t.'仓库名称', t.'库区', t.'库位', t.'商品编码', t.'商品名称', t.'商品条码', t.'单位', t.'规格', wc.classname, t.'分拣类型'
12-20
HTTP/1.1 401 Unauthorized Content-Type: application/soap+xml; charset=utf-8 Connection: close WWW-Authenticate: Digest realm=“Login to 595f962a6e49d8c157d1dea6218657f2”,qop=“auth”,nonce=“b252aWYtZGlnZXN0OjY0NDI0NjQzMTcw”, opaque=“”, stale=“false” Content-Length: 0——import socket import hashlib import random import base64 import time import re 目标设备配置 SERVER_IP = “192.168.1.108” SERVER_PORT = 80 USERNAME = “admin” # HTTP Digest认证的用户名 PASSWORD = “tp111111” # HTTP Digest认证的密码(需替换为实际密码) WSSE_USERNAME = “admin” # WSSE用户名 WSSE_PASSWORD = “tp111111” # WSSE密码(需替换为实际密码) def create_nonce(length=16): “”“生成随机的nonce值”“” return ‘’.join(random.choices(‘0123456789abcdef’, k=length)) def md5_hex(s): “”“计算字符串的MD5哈希值(16进制)”“” return hashlib.md5(s.encode(‘utf-8’)).hexdigest() def calculate_digest_response(method, uri, realm, nonce, nc, cnonce, qop=“auth”): “”“计算Digest认证的response值”“” ha1 = md5_hex(f"{USERNAME}:{realm}:{PASSWORD}“) ha2 = md5_hex(f”{method}:{uri}“) return md5_hex(f”{ha1}:{nonce}:{nc}:{cnonce}:{qop}:{ha2}") def create_wsse_password_digest(nonce, created, password): “”“计算WSSE Password Digest”“” nonce_bytes = base64.b64decode(nonce) created_bytes = created.encode(‘utf-8’) password_bytes = password.encode(‘utf-8’) digest = hashlib.sha1(nonce_bytes + created_bytes + password_bytes).digest() return base64.b64encode(digest).decode(‘utf-8’) def parse_www_authenticate(header): “”“解析WWW-Authenticate头部信息”“” pattern = r’Digest realm=“("+)”,\snonce=“("+)”,\sqop=“("+)”’ match = re.search(pattern, header) if match: return { “realm”: match.group(1), “nonce”: match.group(2), “qop”: match.group(3) } return None try: # === 第一步:发送初始请求获取认证参数 === initial_body = ( ‘’ ‘<s:Envelope xmlns:s=“http://www.w3.org/2003/05/soap-envelope”>’ ‘<s:Body xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=“http://www.w3.org/2001/XMLSchema”>’ ‘’ ‘</s:Body>’ ‘</s:Envelope>’ ) initial_request = ( f"POST /onvif/device_service HTTP/1.1\r\n" f"Host: {SERVER_IP}:{SERVER_PORT}\r\n" f"Content-Type: application/soap+xml; charset=utf-8\r\n" f"Content-Length: {len(initial_body.encode(&#39;utf-8&#39;))}\r\n" "\r\n" f"{initial_body}" ) # 发送初始请求 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((SERVER_IP, SERVER_PORT)) sock.sendall(initial_request.encode(&#39;utf-8&#39;)) print(f"已发送初始请求到 {SERVER_IP}:{SERVER_PORT}") # 接收响应并解析认证参数 response = sock.recv(4096).decode(&#39;utf-8&#39;) auth_header = re.search(r&#39;WWW-Authenticate: (.*?)\r\n&#39;, response) if not auth_header: raise Exception("未收到认证挑战响应") auth_params = parse_www_authenticate(auth_header.group(1)) if not auth_params: raise Exception("无法解析认证参数") # === 第二步:构造带认证的请求 === # 生成认证参数 cnonce = create_nonce(16) nc = "00000001" uri = "/onvif/device_service" # 计算Digest response response_digest = calculate_digest_response( method="POST", uri=uri, realm=auth_params["realm"], nonce=auth_params["nonce"], nc=nc, cnonce=cnonce, qop=auth_params["qop"] ) # 构造Authorization头 auth_header = ( f&#39;Authorization: Digest username="{USERNAME}", realm="{auth_params["realm"]}", &#39; f&#39;qop="{auth_params["qop"]}", algorithm=MD5, uri="{uri}", &#39; f&#39;nonce="{auth_params["nonce"]}", nc={nc}, cnonce="{cnonce}", &#39; f&#39;response="{response_digest}"&#39; ) # 构造WSSE安全头 wsse_nonce = base64.b64encode(os.urandom(16)).decode("utf-8") created = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) password_digest = create_wsse_password_digest( nonce=wsse_nonce, created=created, password=WSSE_PASSWORD ) final_body = ( &#39;<?xml version="1.0" encoding="utf-8"?>&#39; &#39;<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">&#39; &#39;<s:Header>&#39; &#39;<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">&#39; f&#39;<wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">&#39; f&#39;<wsse:Username>{WSSE_USERNAME}</wsse:Username>&#39; &#39;<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">&#39; f&#39;{password_digest}&#39; &#39;</wsse:Password>&#39; f&#39;<wsse:Nonce>{wsse_nonce}</wsse:Nonce>&#39; f&#39;<wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">&#39; f&#39;{created}&#39; &#39;</wsu:Created>&#39; &#39;</wsse:UsernameToken>&#39; &#39;</Security>&#39; &#39;</s:Header>&#39; &#39;<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">&#39; &#39;<GetDeviceInformation xmlns="http://www.onvif.org/ver10/device/wsdl"/>&#39; &#39;</s:Body>&#39; &#39;</s:Envelope>&#39; ) # 构造完整请求 final_request = ( f"POST /onvif/device_service HTTP/1.1\r\n" f"Host: {SERVER_IP}:{SERVER_PORT}\r\n" f"Content-Type: application/soap+xml; charset=utf-8\r\n" f"{auth_header}\r\n" f"Content-Length: {len(final_body.encode(&#39;utf-8&#39;))}\r\n" "\r\n" f"{final_body}" ) # 发送认证请求 sock.sendall(final_request.encode(&#39;utf-8&#39;)) print(f"已发送认证请求到 {SERVER_IP}:{SERVER_PORT}") # 获取最终响应 final_response = sock.recv(4096).decode(&#39;utf-8&#39;) print("收到设备响应:\n", final_response) sock.close() except Exception as e: print(f"请求失败: {str(e)}") ——运行时我的客户端脚本为什么报错:已发送初始请求到 192.168.1.108:80 请求失败: 无法解析认证参数——请找出原因并解决
11-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值