飞雪团队

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

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

[复制链接]

7994

主题

8082

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26312
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
4 d1 ~" F  _+ c& Y$ Z7 `+ r
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>8 q3 D" K, K) R, e4 S* n
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
+ G6 O+ f; V3 x. Y. R不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>& z( `3 B: v- @7 W' D9 k
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>4 q8 E# @1 D( C" D, H1 B/ `
但,女朋友的命令,我是不敢违抗的……<br>! z2 @, O% r" F$ C% s8 a; Z
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
+ t. a5 I% Q# j" c但是睡觉也不能缺!</p>
% `3 k$ f/ @+ u$ g1 X3 v<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
- e3 l7 C, S! G3 j% r<h1 id="python登场">Python登场</h1>
, H$ V* c) T- v* Q) w' T' V, n<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>! r8 O& k- b! j
<h2 id="安装和导入">安装和导入</h2>8 t. c* g7 `3 ]8 a7 V
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
# \7 A" R7 T+ p# h5 R$ Z<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
% W) U* S$ t! f# X6 X<pre><code class="language-p">pip install apscheduler
0 M' e3 C3 V; S7 ?9 B. M$ ]pip install pyautogui
& h, m) |! h3 K4 _, O5 a</code></pre>1 n. e+ r- Y" ]9 C
<p>导入:</p>
/ o6 @( c+ O/ y: {) s+ h2 Z1 A<pre><code class="language-python">import pyautogui' l4 Z+ n/ F& W+ X( _6 `
from datetime import datetime
" X# j2 s+ W/ C) ]from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
: f% l! ?% N3 J* \: F5 D+ D# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
% `8 @# z$ X  F- F$ j# from apscheduler.schedulers.background import BackgroundScheduler" l  w6 u7 B7 B9 Q+ r* P$ P
</code></pre>
* g! Z2 u. z) e$ ^6 G% e$ o5 p, J: q<h1 id="pyautogui">pyautogui</h1>
- n! N- ^6 D# @2 {1 {7 v4 {<p>首先我们来实现自动发送消息</p>
( c! h# b; u. p  I9 {6 L<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>1 U5 z3 l5 o* h) E% ~% B7 _
<p>先来做一些基本设置:</p>/ A0 ]: M7 J; ~) B/ V6 H2 I) y
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
- L  r0 r* e7 a& x</code></pre>
7 e! O8 J, I/ _5 R( n4 M<p>然后我们登录微信,最小化。</p>0 R0 _3 \6 U  S+ ]
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>2 `0 i. |" \6 a2 |5 [' N7 |
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)4 f3 Y# u. q  e& a6 {# E6 |. [
icon_position = pyautogui.position() # Point(x=148, y=879)
+ q4 o; k  T% g4 O* W' e</code></pre>* ]& N" w5 j0 ^) X6 A( K. t
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>; b3 }; v6 A: S0 D; T, m
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>) P; \; Y+ t4 I( L* B+ X
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
7 p2 K& c$ e: }6 Gentry_position = pyautogui.position() # Point(x=174, y=751)
3 f$ i- A0 l- _/ w  w  }: r</code></pre>
" E) d% _( ]& o<p>接下来,控制程序依次点击这两个点:</p>1 [0 u$ a. t9 S- U8 n' h
<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
9 D5 r- ~$ U8 \4 `# pyautogui.click(148, 879)9 c) s& `: k- c' V( l! u
pyautogui.click(entry_position)
5 Y' V! v& H0 n! z9 {8 b2 R% J8 G# pyautogui.click(174, 751)# F1 s2 v3 P; P+ F/ l
</code></pre>/ W1 f) @7 s7 X, s! ]: [
<p>打开微信并锁定焦点后,我们开始输入文本。</p>
7 N2 t- \) C! |9 c# l<p>输入文本可以有两种方式:</p>
2 g+ R$ }8 j1 S& G# v6 n<ul>
  W% v8 `3 P& k% w) u' ]4 `<li>
+ z! l) G  Z$ r0 ~( H<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
  q% b3 q) J! Z# r<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
+ A; Y% g, n1 l9 A. b( r4 o6 s</li>1 ]% d7 g  n1 `! j) `: g2 ]
<li>
* Y1 T" k( O, B8 Y2 o% e6 @<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>6 Z( W0 [* v+ b# \
<p>传入字符串,但不能同时打印字母和特殊按键。</p>  [$ ?# M# ?! b. t8 w9 W4 M: X- n
</li>" \5 O6 p- P5 _  b- T; }4 p
</ul>
4 z( u; D  ~9 h9 ?5 D<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>$ b0 u$ q6 L5 J7 p2 S+ ^/ d2 [
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间  e; y4 U3 o/ ^# i/ Y4 m$ u
</code></pre>4 t% A  m5 s; t9 o" P
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p># f$ O, Q. G( Y8 \$ ]6 h7 _
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选9 ?/ c0 }  {* {$ x7 }
pyautogui.click(icon_position)
% w8 \, D5 q6 E5 J+ C' [pyautogui.moveTo(entry_position, duration=2)
/ G4 j) \8 r3 n- P4 o* C% L- Ppyautogui.click(entry_position)
- ~5 s6 m# W& _& q/ W) B/ V. {" w8 opyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选. R* R. J" v  N* ?- B) V; m
</code></pre>
' h  N/ w3 P# ?$ {<p>看看效果:<br>
& u; }0 E: M$ b0 W<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>( r9 X& B1 {0 c$ G5 s" ~) F  `
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
, ~9 K# F) \$ R' s' l<pre><code class="language-python">import pyperclip$ |9 N1 O4 ~0 x/ G* D5 ?$ d
" \2 V8 J3 a; _- A6 Q* G
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制: N$ q& H! t6 c( \' x; u* v
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
" ], I0 Q6 `+ n# n. F$ upyautogui.press('enter') # 按下按键9 \9 Z4 I1 V0 I- Z
</code></pre>, L! ~1 y7 p/ A( d
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
7 h. y" }) [' i# n# U. `3 R1 y4 E6 `# N' ?这样,我们便完成了自动发送微信消息的功能了。</p>
0 r7 H1 X- H9 C7 v4 j2 D; C<h1 id="apscheduler">apscheduler</h1>
' |+ R# |" e3 \7 w$ k- z8 z+ L3 t<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
4 {9 Y4 s. Z) M/ C0 m+ p6 T: r8 m: Q<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
  X5 D' q- i! N  D$ K; E6 Kscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务( J, Q, N/ T; @$ r
scheduler.start()3 `7 H8 |# y' s  \. n
</code></pre>
9 w! H* r3 N1 W/ p9 R: i<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>
0 n( e& `* |- Q# o0 S5 t' e<h1 id="完整代码">完整代码</h1>
* E% f  |$ [9 R2 Q- Q0 L( ?<pre><code class="language-python">import pyautogui" l# P7 L5 s  @2 Z
import pyperclip" A" n$ ]+ Z" e' p% r0 t% j
from datetime import datetime$ b7 M2 z& ~" h: Z
from apscheduler.schedulers.blocking import BlockingScheduler
- i" `" P4 b7 a. \4 r' m$ S  f9 m( `, S# p9 p5 z7 q$ e
def main():
; b" _( V! [$ V; @' G. H& `        pyautogui.PAUSE = 0
) T$ [9 U" K% c# H9 K* i
$ Z, F0 X5 G4 O8 H4 w5 f0 y        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置/ @+ k! A6 Z4 t$ z
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置- N$ v# R! W4 J1 h
! [! F* H1 k0 s6 X! M: j
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
! u( Z, g2 a+ P8 k7 |& {        pyautogui.click(icon_position)3 t8 J+ n( \( ~8 b& n
        pyautogui.moveTo(entry_position, duration=0.7)  O! u) u* \! J( k! O
        pyautogui.click(entry_position)
  s* {" X4 d6 Z! R        pyperclip.copy('快去睡觉')
# ]( M9 g, ^, e8 X" B: p+ |        pyautogui.hotkey('ctrl', 'v')
* T0 `  X8 H) \* o& P2 I) ^        pyautogui.press('enter')
, P# f, T/ j7 i) z    pyperclip.copy('笨猪')1 `7 z: I& S4 ~- W8 K; @. V
        pyautogui.hotkey('ctrl', 'v')' w" H: w7 n( V
        pyautogui.press('enter')
2 w% {" Q+ U, R" r; Q$ X- |   
0 `% z, C! R; y+ V' L% p' gscheduler = BlockingScheduler() # 实例化
7 h8 B0 H1 S2 `# C# F& j3 R, ?scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
! l, j9 k' V$ T' qscheduler.start()
) n" i  A  V4 e, `8 A& T</code></pre>& h9 q: B7 }' c2 A; I3 m/ h, p
<p>完成啦!现在可以去睡觉了。</p>
, }% ?$ a6 o' b<h1 id="结果">结果</h1>+ L  I5 @* E: ]( Q& H7 y5 g( ~! V. s
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
: N8 f' w  b" E9 u<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
( |0 T/ J* m7 M. M! u" g* m* {<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
: c( u5 Q; o  v" J8 K3 w8 k, ]<hr>6 D0 F$ `& G  j  K
<h1 id="---the-end---">-- the End --</h1>
0 T8 \, a% _" ]8 X# \  }+ t<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>+ w% y* z3 c$ U$ v
<p>打个小广告:作者CSDN博客主页:<br>5 w8 Y% y; g2 q& D, Q0 O) ~* D
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
& e5 k& V1 z3 \, ~- s. {3 r
0 o( d2 s; s- s5 C" A7 o& ^
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-11-30 07:59 , Processed in 0.064823 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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