基于Python实现通过微信搜索功能查看谁把你删除了

发表于 5年以前  | 总阅读数:1223 次

场景:查找who删了我,直接copy代码保存到一个python文件who.py,在python环境下运行此文件

代码如下,copy保存到who.py文件在python环境直接运行:


    #!/usr/bin/env python
    # coding=utf-8
    from __future__ import print_function
    import os
    try:
    from urllib import urlencode, quote_plus
    except ImportError:
    from urllib.parse import urlencode, quote_plus
    try:
    import urllib2 as wdf_urllib
    from cookielib import CookieJar
    except ImportError:
    import urllib.request as wdf_urllib
    from http.cookiejar import CookieJar
    import re
    import time
    import xml.dom.minidom
    import json
    import sys
    import math
    import subprocess
    import ssl
    import thread
    DEBUG = False
    MAX_GROUP_NUM = 35 # 每组人数
    INTERFACE_CALLING_INTERVAL = 20 # 接口调用时间间隔, 间隔太短容易出现"操作太频繁", 会被限制操作半小时左右
    MAX_PROGRESS_LEN = 50
    QRImagePath = os.path.join(os.getcwd(), 'qrcode.jpg')
    tip = 0
    uuid = ''
    base_uri = ''
    redirect_uri = ''
    push_uri = ''
    skey = ''
    wxsid = ''
    wxuin = ''
    pass_ticket = ''
    deviceId = 'e000000000000000'
    BaseRequest = {}
    ContactList = []
    My = []
    SyncKey = []
    try:
    xrange
    range = xrange
    except:
    # python 3
    pass
    def responseState(func, BaseResponse):
    ErrMsg = BaseResponse['ErrMsg']
    Ret = BaseResponse['Ret']
    if DEBUG or Ret != 0:
    print('func: %s, Ret: %d, ErrMsg: %s' % (func, Ret, ErrMsg))
    if Ret != 0:
    return False
    return True
    def getRequest(url, data=None):
    try:
    data = data.encode('utf-8')
    except:
    pass
    finally:
    return wdf_urllib.Request(url=url, data=data)
    def getUUID():
    global uuid
    url = 'https://login.weixin.qq.com/jslogin'
    params = {
    'appid': 'wx782c26e4c19acffb',
    'fun': 'new',
    'lang': 'zh_CN',
    '_': int(time.time()),
    }
    request = getRequest(url=url, data=urlencode(params))
    response = wdf_urllib.urlopen(request)
    data = response.read().decode('utf-8', 'replace')
    # print(data)
    # window.QRLogin.code = 200; window.QRLogin.uuid = "oZwt_bFfRg==";
    regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"'
    pm = re.search(regx, data)
    code = pm.group(1)
    uuid = pm.group(2)
    if code == '200':
    return True
    return False
    def showQRImage():
    global tip
    url = 'https://login.weixin.qq.com/qrcode/' + uuid
    params = {
    't': 'webwx',
    '_': int(time.time()),
    }
    request = getRequest(url=url, data=urlencode(params))
    response = wdf_urllib.urlopen(request)
    tip = 1
    f = open(QRImagePath, 'wb')
    f.write(response.read())
    f.close()
    if sys.platform.find('darwin') >= 0:
    subprocess.call(['open', QRImagePath])
    elif sys.platform.find('linux') >= 0:
    subprocess.call(['xdg-open', QRImagePath])
    else:
    os.startfile(QRImagePath)
    print('请使用微信扫描二维码以登录')
    def waitForLogin():
    global tip, base_uri, redirect_uri, push_uri
    url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid;=%s&_=%s' % (
    tip, uuid, int(time.time()))
    request = getRequest(url=url)
    response = wdf_urllib.urlopen(request)
    data = response.read().decode('utf-8', 'replace')
    # print(data)
    # window.code=500;
    regx = r'window.code=(\d+);'
    pm = re.search(regx, data)
    code = pm.group(1)
    if code == '201': # 已扫描
    print('成功扫描,请在手机上点击确认以登录')
    tip = 0
    elif code == '200': # 已登录
    print('正在登录...')
    regx = r'window.redirect_uri="(\S+?)";'
    pm = re.search(regx, data)
    redirect_uri = pm.group(1) + '&fun;=new'
    base_uri = redirect_uri[:redirect_uri.rfind('/')]
    # push_uri与base_uri对应关系(排名分先后)(就是这么奇葩..)
    services = [
    ('wx2.qq.com', 'webpush2.weixin.qq.com'),
    ('qq.com', 'webpush.weixin.qq.com'),
    ('web1.wechat.com', 'webpush1.wechat.com'),
    ('web2.wechat.com', 'webpush2.wechat.com'),
    ('wechat.com', 'webpush.wechat.com'),
    ('web1.wechatapp.com', 'webpush1.wechatapp.com'),
    ]
    push_uri = base_uri
    for (searchUrl, pushUrl) in services:
    if base_uri.find(searchUrl) >= 0:
    push_uri = 'https://%s/cgi-bin/mmwebwx-bin' % pushUrl
    break
    # closeQRImage
    if sys.platform.find('darwin') >= 0: # for OSX with Preview
    os.system("osascript -e 'quit app \"Preview\"'")
    elif code == '408': # 超时
    pass
    # elif code == '400' or code == '500':
    return code
    def login():
    global skey, wxsid, wxuin, pass_ticket, BaseRequest
    request = getRequest(url=redirect_uri)
    response = wdf_urllib.urlopen(request)
    data = response.read().decode('utf-8', 'replace')
    # print(data)
    doc = xml.dom.minidom.parseString(data)
    root = doc.documentElement
    for node in root.childNodes:
    if node.nodeName == 'skey':
    skey = node.childNodes[0].data
    elif node.nodeName == 'wxsid':
    wxsid = node.childNodes[0].data
    elif node.nodeName == 'wxuin':
    wxuin = node.childNodes[0].data
    elif node.nodeName == 'pass_ticket':
    pass_ticket = node.childNodes[0].data
    # print('skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s' % (skey, wxsid,
    # wxuin, pass_ticket))
    if not all((skey, wxsid, wxuin, pass_ticket)):
    return False
    BaseRequest = {
    'Uin': int(wxuin),
    'Sid': wxsid,
    'Skey': skey,
    'DeviceID': deviceId,
    }
    return True
    def webwxinit():
    url = base_uri + \
    '/webwxinit?pass_ticket=%s&skey;=%s&r;=%s' % (
    pass_ticket, skey, int(time.time()))
    params = {
    'BaseRequest': BaseRequest
    }
    request = getRequest(url=url, data=json.dumps(params))
    request.add_header('ContentType', 'application/json; charset=UTF-8')
    response = wdf_urllib.urlopen(request)
    data = response.read()
    if DEBUG:
    f = open(os.path.join(os.getcwd(), 'webwxinit.json'), 'wb')
    f.write(data)
    f.close()
    data = data.decode('utf-8', 'replace')
    # print(data)
    global ContactList, My, SyncKey
    dic = json.loads(data)
    ContactList = dic['ContactList']
    My = dic['User']
    SyncKey = dic['SyncKey']
    state = responseState('webwxinit', dic['BaseResponse'])
    return state
    def webwxgetcontact():
    url = base_uri + \
    '/webwxgetcontact?pass_ticket=%s&skey;=%s&r;=%s' % (
    pass_ticket, skey, int(time.time()))
    request = getRequest(url=url)
    request.add_header('ContentType', 'application/json; charset=UTF-8')
    response = wdf_urllib.urlopen(request)
    data = response.read()
    if DEBUG:
    f = open(os.path.join(os.getcwd(), 'webwxgetcontact.json'), 'wb')
    f.write(data)
    f.close()
    # print(data)
    data = data.decode('utf-8', 'replace')
    dic = json.loads(data)
    MemberList = dic['MemberList']
    # 倒序遍历,不然删除的时候出问题..
    SpecialUsers = ["newsapp", "fmessage", "filehelper", "weibo", "qqmail", "tmessage", "qmessage", "qqsync", "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp", "masssendapp",
    "meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder", "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxitil", "userexperience_alarm"]
    for i in range(len(MemberList) - 1, -1, -1):
    Member = MemberList[i]
    if Member['VerifyFlag'] & 8 != 0: # 公众号/服务号
    MemberList.remove(Member)
    elif Member['UserName'] in SpecialUsers: # 特殊账号
    MemberList.remove(Member)
    elif Member['UserName'].find('@@') != -1: # 群聊
    MemberList.remove(Member)
    elif Member['UserName'] == My['UserName']: # 自己
    MemberList.remove(Member)
    return MemberList
    def createChatroom(UserNames):
    MemberList = [{'UserName': UserName} for UserName in UserNames]
    url = base_uri + \
    '/webwxcreatechatroom?pass_ticket=%s&r;=%s' % (
    pass_ticket, int(time.time()))
    params = {
    'BaseRequest': BaseRequest,
    'MemberCount': len(MemberList),
    'MemberList': MemberList,
    'Topic': '',
    }
    request = getRequest(url=url, data=json.dumps(params))
    request.add_header('ContentType', 'application/json; charset=UTF-8')
    response = wdf_urllib.urlopen(request)
    data = response.read().decode('utf-8', 'replace')
    # print(data)
    dic = json.loads(data)
    ChatRoomName = dic['ChatRoomName']
    MemberList = dic['MemberList']
    DeletedList = []
    BlockedList = []
    for Member in MemberList:
    if Member['MemberStatus'] == 4: # 被对方删除了
    DeletedList.append(Member['UserName'])
    elif Member['MemberStatus'] == 3: # 被加入黑名单
    BlockedList.append(Member['UserName'])
    state = responseState('createChatroom', dic['BaseResponse'])
    return ChatRoomName, DeletedList, BlockedList
    def deleteMember(ChatRoomName, UserNames):
    url = base_uri + \
    '/webwxupdatechatroom?fun=delmember&pass;_ticket=%s' % (pass_ticket)
    params = {
    'BaseRequest': BaseRequest,
    'ChatRoomName': ChatRoomName,
    'DelMemberList': ','.join(UserNames),
    }
    request = getRequest(url=url, data=json.dumps(params))
    request.add_header('ContentType', 'application/json; charset=UTF-8')
    response = wdf_urllib.urlopen(request)
    data = response.read().decode('utf-8', 'replace')
    # print(data)
    dic = json.loads(data)
    state = responseState('deleteMember', dic['BaseResponse'])
    return state
    def addMember(ChatRoomName, UserNames):
    url = base_uri + \
    '/webwxupdatechatroom?fun=addmember&pass;_ticket=%s' % (pass_ticket)
    params = {
    'BaseRequest': BaseRequest,
    'ChatRoomName': ChatRoomName,
    'AddMemberList': ','.join(UserNames),
    }
    request = getRequest(url=url, data=json.dumps(params))
    request.add_header('ContentType', 'application/json; charset=UTF-8')
    response = wdf_urllib.urlopen(request)
    data = response.read().decode('utf-8', 'replace')
    # print(data)
    dic = json.loads(data)
    MemberList = dic['MemberList']
    DeletedList = []
    BlockedList = []
    for Member in MemberList:
    if Member['MemberStatus'] == 4: # 被对方删除了
    DeletedList.append(Member['UserName'])
    elif Member['MemberStatus'] == 3: # 被加入黑名单
    BlockedList.append(Member['UserName'])
    state = responseState('addMember', dic['BaseResponse'])
    return DeletedList, BlockedList
    def syncKey():
    SyncKeyItems = ['%s_%s' % (item['Key'], item['Val'])
    for item in SyncKey['List']]
    SyncKeyStr = '|'.join(SyncKeyItems)
    return SyncKeyStr
    def syncCheck():
    url = push_uri + '/synccheck?'
    params = {
    'skey': BaseRequest['Skey'],
    'sid': BaseRequest['Sid'],
    'uin': BaseRequest['Uin'],
    'deviceId': BaseRequest['DeviceID'],
    'synckey': syncKey(),
    'r': int(time.time()),
    }
    request = getRequest(url=url + urlencode(params))
    response = wdf_urllib.urlopen(request)
    data = response.read().decode('utf-8', 'replace')
    # print(data)
    # window.synccheck={retcode:"0",selector:"2"}
    regx = r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}'
    pm = re.search(regx, data)
    retcode = pm.group(1)
    selector = pm.group(2)
    return selector
    def webwxsync():
    global SyncKey
    url = base_uri + '/webwxsync?lang=zh_CN&skey;=%s&sid;=%s&pass;_ticket=%s' % (
    BaseRequest['Skey'], BaseRequest['Sid'], quote_plus(pass_ticket))
    params = {
    'BaseRequest': BaseRequest,
    'SyncKey': SyncKey,
    'rr': ~int(time.time()),
    }
    request = getRequest(url=url, data=json.dumps(params))
    request.add_header('ContentType', 'application/json; charset=UTF-8')
    response = wdf_urllib.urlopen(request)
    data = response.read().decode('utf-8', 'replace')
    # print(data)
    dic = json.loads(data)
    SyncKey = dic['SyncKey']
    state = responseState('webwxsync', dic['BaseResponse'])
    return state
    def heartBeatLoop():
    while True:
    selector = syncCheck()
    if selector != '0':
    webwxsync()
    time.sleep(1)
    def main():
    try:
    ssl._create_default_https_context = ssl._create_unverified_context
    opener = wdf_urllib.build_opener(
    wdf_urllib.HTTPCookieProcessor(CookieJar()))
    opener.addheaders = [
    ('User-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')]
    wdf_urllib.install_opener(opener)
    except:
    pass
    if not getUUID():
    print('获取uuid失败')
    return
    print('正在获取二维码图片...')
    showQRImage()
    time.sleep(1)
    while waitForLogin() != '200':
    pass
    os.remove(QRImagePath)
    if not login():
    print('登录失败')
    return
    if not webwxinit():
    print('初始化失败')
    return
    MemberList = webwxgetcontact()
    print('开启心跳线程')
    thread.start_new_thread(heartBeatLoop, ())
    MemberCount = len(MemberList)
    print('通讯录共%s位好友' % MemberCount)
    ChatRoomName = ''
    result = []
    d = {}
    for Member in MemberList:
    d[Member['UserName']] = (Member['NickName'].encode(
    'utf-8'), Member['RemarkName'].encode('utf-8'))
    print('开始查找...')
    group_num = int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))
    for i in range(0, group_num):
    UserNames = []
    for j in range(0, MAX_GROUP_NUM):
    if i * MAX_GROUP_NUM + j >= MemberCount:
    break
    Member = MemberList[i * MAX_GROUP_NUM + j]
    UserNames.append(Member['UserName'])
    # 新建群组/添加成员
    if ChatRoomName == '':
    (ChatRoomName, DeletedList, BlockedList) = createChatroom(
    UserNames)
    else:
    (DeletedList, BlockedList) = addMember(ChatRoomName, UserNames)
    # todo BlockedList 被拉黑列表
    DeletedCount = len(DeletedList)
    if DeletedCount > 0:
    result += DeletedList
    # 删除成员
    deleteMember(ChatRoomName, UserNames)
    # 进度条
    progress = MAX_PROGRESS_LEN * (i + 1) / group_num
    print('[', '#' * progress, '-' * (MAX_PROGRESS_LEN - progress), ']', end=' ')
    print('新发现你被%d人删除' % DeletedCount)
    for i in range(DeletedCount):
    if d[DeletedList[i]][1] != '':
    print(d[DeletedList[i]][0] + '(%s)' % d[DeletedList[i]][1])
    else:
    print(d[DeletedList[i]][0])
    if i != group_num - 1:
    print('正在继续查找,请耐心等待...')
    # 下一次进行接口调用需要等待的时间
    time.sleep(INTERFACE_CALLING_INTERVAL)
    # todo 删除群组
    print('\n结果汇总完毕,20s后可重试...')
    resultNames = []
    for r in result:
    if d[r][1] != '':
    resultNames.append(d[r][0] + '(%s)' % d[r][1])
    else:
    resultNames.append(d[r][0])
    print('---------- 被删除的好友列表(共%d人) ----------' % len(result))
    # 过滤emoji
    resultNames = map(lambda x: re.sub(r'<span.+/span>', '', x), resultNames)
    if len(resultNames):
    print('\n'.join(resultNames))
    else:
    print("无")
    print('---------------------------------------------')
    # windows下编码问题修复
    # http://blog.csdn.net/heyuxuanzee/article/details/8442718
    class UnicodeStreamFilter:
    def __init__(self, target):
    self.target = target
    self.encoding = 'utf-8'
    self.errors = 'replace'
    self.encode_to = self.target.encoding
    def write(self, s):
    if type(s) == str:
    s = s.decode('utf-8')
    s = s.encode(self.encode_to, self.errors).decode(self.encode_to)
    self.target.write(s)
    if sys.stdout.encoding == 'cp936':
    sys.stdout = UnicodeStreamFilter(sys.stdout)
    if __name__ == '__main__':
    print('本程序的查询结果可能会引起一些心理上的不适,请小心使用...')
    main()
    print('回车键退出...')

以上所述是基于Python实现微信搜索查看谁把你删除了的相关内容,希望对大家有所帮助。

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237229次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8063次阅读
 目录