飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 11583|回复: 0

女朋友让我深夜十二点催她睡觉,我有Python我就不干

[复制链接]

7241

主题

7329

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
24053
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
: r4 W; n0 J1 d; L
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>5 V# C# Z3 b- s8 {, G! n
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
, Z* r& W1 L4 ?' \- w" i, c) J0 l不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>9 P8 r) C* W8 S  n
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>: e$ j" Q* J, P' n3 q
但,女朋友的命令,我是不敢违抗的……<br>
) h2 ~7 l; `7 H9 _5 Y<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
, W6 S  ~1 y1 z0 ?& r  @但是睡觉也不能缺!</p>
5 {: w+ Y1 R6 g8 I# N$ U( m<p>这时候我们该怎么办呢?是时候让Python登场了!</p>$ R/ k% X6 O; H* J
<h1 id="python登场">Python登场</h1>( P, I! @6 I4 _; k* J- C
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
: k( A8 ~/ [/ {' j<h2 id="安装和导入">安装和导入</h2>0 \% R9 k4 k+ \
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>+ L. v0 f" _- e; [& g
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
/ t1 W! J% B; D( e: H# [<pre><code class="language-p">pip install apscheduler/ X( o2 K6 J" y6 ?( x
pip install pyautogui6 x8 `5 Q4 Y8 s; L
</code></pre>- _0 _3 N( i( z( m/ c
<p>导入:</p>2 r. ~. j' c# x, C
<pre><code class="language-python">import pyautogui: x6 b, B- o- O& F  e3 V
from datetime import datetime, W% n7 i8 p9 z7 W% \* F3 J, G4 Q- D
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器7 @. _: z8 g$ r) k# r# I
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:# m* F/ u( q" F- n1 M7 c" S# V
# from apscheduler.schedulers.background import BackgroundScheduler( o. V5 x: M$ B- O+ a" Y
</code></pre>
8 {, x/ D6 p- t9 H<h1 id="pyautogui">pyautogui</h1>
: z, p* }6 S0 M, J/ m: t- d( v<p>首先我们来实现自动发送消息</p>) ~6 e( g* X9 D2 J8 S, M5 k
<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>$ c3 R. p$ K, W+ b$ ~
<p>先来做一些基本设置:</p>7 g. t( W& ]- M0 }* ^% E+ \8 Q/ s1 R
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快) L) i6 b' a+ I: E3 G: v
</code></pre>
! _+ n" @5 Z( S$ k5 d" ?<p>然后我们登录微信,最小化。</p>
  u& `- ^& ?8 l<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
* V* _& k* U; ^# S6 M" b, \% E<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)0 r# @$ d5 R2 ~" N- D; W9 A% F
icon_position = pyautogui.position() # Point(x=148, y=879)/ z& o7 g2 O* Y" s, ?
</code></pre>+ Q. [7 P9 R( n" P- S1 V$ Y
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
3 o& o3 [7 c& c+ e<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>$ L, R2 X8 |2 c$ D) M$ o
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
# y7 P' _- ~+ p2 m, P: O8 Fentry_position = pyautogui.position() # Point(x=174, y=751)
4 n0 ]2 }. g' b9 e% X</code></pre>
0 K: \1 B/ E3 _5 l3 C/ \" i' C<p>接下来,控制程序依次点击这两个点:</p>; v2 r- v% j' |) R+ n& T
<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
8 d5 @4 F5 `) I6 o) |# pyautogui.click(148, 879)5 o, O9 ^8 X7 D! S& C- {! b5 T1 U
pyautogui.click(entry_position)
# [1 x" z6 ~' K% T. |# pyautogui.click(174, 751)( h4 N/ _! t4 e. F) Z5 a
</code></pre>2 u# L8 V, ~- B" `
<p>打开微信并锁定焦点后,我们开始输入文本。</p>% f  m7 f9 O0 ]& x
<p>输入文本可以有两种方式:</p>' K: W7 O8 H$ |- q$ Y
<ul>
" y  L3 q7 f7 t3 X" J- }, P- F<li>
" x2 P3 m1 H9 n- F" h1 D1 [9 h& T* [<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
1 U2 y1 E( B4 r<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
9 {4 s; B9 d0 b  m</li>
  [+ J# v: ^( H! W<li>! \. `$ e3 Y% c: C, m
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>4 p' H" j1 Z' z' H3 p
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
$ s- `4 l3 z- s/ C1 I! h3 l5 l3 ?% C</li>
/ v( j0 p5 E4 {& E</ul>9 ^! e* k/ G4 r) x  Z$ z9 }9 z0 n$ f1 V- ?
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
% t' c& d. a! S1 V( Z7 d0 L<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
& r8 l/ u. J1 }5 S% K6 {9 B: T</code></pre>' h  Y% [2 W) s5 q
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>( U+ f* I3 m% H2 m& g: E5 a
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
% J6 K; p4 V9 bpyautogui.click(icon_position)% H2 R: P. u3 p/ g. C
pyautogui.moveTo(entry_position, duration=2)9 a3 I5 i' l/ P
pyautogui.click(entry_position)& r/ k% e. o, T. E- e, i
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选9 V9 T2 j% ?/ P  N
</code></pre>3 w  j: |9 f  j" i
<p>看看效果:<br>; n- ~! X" B. ^3 o# l
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
' g- B3 U( v" Q) K5 t$ A当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>, G  H- Q- l) L# ~7 }, f- ?
<pre><code class="language-python">import pyperclip
' f) Z2 m$ o/ x- {; x& I6 R$ V5 a4 F  O; N( A4 }' |4 }
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制( B$ g: C" ]8 L% L5 R
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴! H" L7 o: E* ^/ ^+ E* W& m" K
pyautogui.press('enter') # 按下按键
& A) K) Z' a  n+ l$ M3 Y/ O</code></pre>
  d/ m% q* ^  p8 Q<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>5 R( `% ~* C+ @( I0 R
这样,我们便完成了自动发送微信消息的功能了。</p>
- @  C1 a: y# M( [<h1 id="apscheduler">apscheduler</h1>1 }3 `/ @6 e0 w# e
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
, t# m/ m9 G9 i4 a# m<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器* G) B& p4 f) g* n- f# H
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务# {' A: ^' F- E3 J  y, \# T0 r1 W
scheduler.start()
( Q! [4 T5 c% _4 g/ j2 g+ H</code></pre>
+ I# r4 e7 y4 D+ L* k( b$ k1 N* X3 o<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>3 m% ?( W' ~* I& J& _# G
<h1 id="完整代码">完整代码</h1>' g! a5 d( \3 J$ f. V3 D' {4 W! N  e7 {  k
<pre><code class="language-python">import pyautogui& A) C2 E# m* O1 {" S* Q% M
import pyperclip( r6 w% b8 u) J
from datetime import datetime( M4 N3 u3 C3 C% y
from apscheduler.schedulers.blocking import BlockingScheduler+ _' P8 F. K4 O4 `2 o  M) N

( U( b- H% C# `4 k7 J) Zdef main():
8 V7 \* ]: F! B3 w  y1 ~) l* S        pyautogui.PAUSE = 0
. T4 |, |' p: C2 o& Q7 O5 a5 @& Z5 \) o0 Q1 W/ U5 a* x& f
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
8 R+ w' b4 j7 w; |/ K) i        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置5 e9 W7 }1 B/ W+ p  [

& Y& }0 \; W) n) _+ M- w5 m4 ?: P        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选; s6 K& f- T6 t4 n% Q( ~
        pyautogui.click(icon_position)0 d6 `7 ^( W4 n& n$ w7 x( E5 M5 g
        pyautogui.moveTo(entry_position, duration=0.7)
9 `+ F3 L( i' ?        pyautogui.click(entry_position)
6 d: t% D3 G) y0 X: E9 r. E        pyperclip.copy('快去睡觉')
0 I/ a0 U( C) j' ^' s5 m7 x2 G! Z        pyautogui.hotkey('ctrl', 'v')- U0 q* ~' C" r% }* S+ M8 b4 I
        pyautogui.press('enter')9 S6 C) J: j& N( {) P! E
    pyperclip.copy('笨猪')
7 @% G& u, y5 k7 s: \0 `1 r! M$ J1 L        pyautogui.hotkey('ctrl', 'v')
. F2 ?' B2 z3 i4 }, X2 w2 b% k        pyautogui.press('enter')5 y  R' H3 y( G: I  r, C3 N# i
    0 a. `6 ^/ C9 }7 o/ E6 K
scheduler = BlockingScheduler() # 实例化
0 v3 D- L6 K) Escheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务! _, N: ?$ \2 Z. z6 [- B9 v' D
scheduler.start()+ `, m+ K0 T/ X
</code></pre>$ |! t1 i  n' j9 \) o" B
<p>完成啦!现在可以去睡觉了。</p>. {0 f5 ~6 r3 ^4 c; n
<h1 id="结果">结果</h1>* _, u3 C# k( X7 j
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
) L: P& Q- N4 |6 S/ w2 C/ s8 W<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
! O: S  q1 o  ]! t2 g8 B<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>) x! d$ o5 \- e* l1 v
<hr>
" q' e1 U' }, X  i<h1 id="---the-end---">-- the End --</h1># y6 f7 v$ w+ \9 o- C, l# ]
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
! i( w  {$ _1 _- ?3 [% Z$ c3 ?<p>打个小广告:作者CSDN博客主页:<br>' k5 Q: }; b; g! \. Y
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>& a( j7 [& r5 U* ]

" t# P/ i* N: Q" g- T2 n: B
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|飞雪团队

GMT+8, 2025-8-15 10:08 , Processed in 0.101296 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表