使用Python编写一个在Linux下实现截图分享的脚本的教程


Posted in Python onApril 24, 2015

引子

Linux下不支持QQ等功能丰富的IM,虽然可以通过wine运行QQ2012,但是还是喜欢在gtalk群中聊天,gtalk群不支持图片方式,这就要靠我们大家自己来解决了,eleven开放了一个Image上传和显示接口,提供了使用curl来解决,但是我们公司的网络使用squid禁止了curl的访问,所以整天看他们这么爽的分享图片我也不甘心阿,所以就使用Python写了一个分享图片的脚本
实现

使用scrot截图,然后使用urllib2库上传图片,如果存在PyQt4库则会将结果放到剪贴板上,如果不存在则输出,自行复制
代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Author : cold
# E-mail : wh_linux@126.com
# Date : 13/01/21 09:54:39
# Desc : 贴代码和图片
#
import urllib2, json
import mimetools
import mimetypes
import itertools

__host__ = "http://eleveni386.7axu.com"

class Form(object):
 def __init__(self):
  self.form_fields = []
  self.files = []
  self.boundary = mimetools.choose_boundary()
  self.content_type = "application/x-www-form-urlencoded"
  return

 def get_content_type(self):
  return self.content_type

 def add_field(self, name, value):
  self.form_fields.append((name, value))
  return

 def add_file(self, fieldname, filename, fileHandle, mimetype=None):
  body = fileHandle.read()
  if mimetype is None:
   mimetype = ( mimetypes.guess_type(filename)[0]
       or
       'applicatioin/octet-stream')
  self.files.append((fieldname, filename, mimetype, body))
  self.content_type = 'multipart/form-data; boundary=%s' % self.boundary

  return

 def __str__(self):
  parts = []
  part_boundary = '--' + self.boundary

  parts.extend(
   [ part_boundary,
    'Content-Disposition: form-data; name="%s"' % name,
    '',
    value,
    ]
   for name, value in self.form_fields)
  if self.files:
   parts.extend([
    part_boundary,
    'Content-Disposition: form-data; name="%s"; filename="%s"' %\
    (field_name, filename),
    'Content-Type: %s' % content_type,
    '',
    body,
   ] for field_name, filename, content_type, body in self.files)

  flattened = list(itertools.chain(*parts))
  flattened.append('--' + self.boundary + '--')
  flattened.append('')
  return '\r\n'.join(flattened)


class HttpHelper(object):
 def __init__(self, url = None, form = None, method = 'GET'):
  self._url = url
  self._form = form
  self._body = str(form)
  self._method = method
  self._dst_url = None
  if url:
   self.make_request()

 def make_request(self):
  url = self._url
  if not self._url.startswith('http://'):
   url = 'http://' + self._url
  self.request = urllib2.Request(url)
  if self._form:
   self.add_header("Content-Type", self._form.get_content_type())
   self.add_header("Content-Length", len(self._body))
   self.request.add_data(self._body)

 def add_header(self, key, val):
  self.request.add_header(key, val)

 def change(self, url, params = {}, method = 'GET'):
  self._url = url
  self._params = params
  self._method = method
  self.make_request()

 def open(self):
  response = urllib2.urlopen(self.request)
  content = response.read()
  self._dst_url = response.geturl()
  try:
   return json.loads(content)
  except:
   return content

if __name__ == "__main__":
 import argparse
 import os
 parser = argparse.ArgumentParser()
 parser.add_argument(dest="path", nargs="?")
 args = parser.parse_args()
 if args.path:
  path = args.path
 else:
  path = r"/tmp/tmpscrot.png"
  os.system("scrot -s {0}".format(path))
 form = Form()
 filename = os.path.split(path)[-1]
 form.add_file(fieldname='mypic', filename=filename,
     fileHandle=open(path))
 http = HttpHelper( __host__ + '/Image/', form)
 url = http.open()
 try:
  from PyQt4.QtGui import QApplication
  app = QApplication([])
  cb = QApplication.clipboard()
  cb.setText(url)
 except:
  print url

安装

将上面代码保存一个文件,放在PATH路径里,赋予执行权限即可
使用

默认的不跟图片地址则会截图,截图完毕后自动分享,如安装了PyQt4库则会将结果放到剪贴板,如没有则输出结果.如果脚本给了图片路径参数则上传给定路径的图片

Python 相关文章推荐
Python 模板引擎的注入问题分析
Jan 01 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
Python爬虫工程师面试问题总结
Mar 22 Python
python中正则表达式与模式匹配
May 07 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
Python单元测试工具doctest和unittest使用解析
Sep 02 Python
学习Django知识点分享
Sep 11 Python
基于python的docx模块处理word和WPS的docx格式文件方式
Feb 13 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
vscode+PyQt5安装详解步骤
Aug 12 Python
Python面向对象之成员相关知识总结
Jun 24 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 #Python
Python的Tornado框架异步编程入门实例
Apr 24 #Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
Apr 24 #Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 #Python
简单说明Python中的装饰器的用法
Apr 24 #Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 #Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 #Python
You might like
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
2014/05/23 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
React快速入门教程
2017/01/17 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
[53:52]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
What is view? why do we have view?
2012/06/22 面试题
个人廉洁自律承诺书
2014/03/27 职场文书
反邪教警示教育方案
2014/05/13 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫