wechat

Python实现发票自动校核微信机器人的方法

梦想与她 提交于 2020-08-07 06:37:23
制作初衷: 外地开了票到公司后发现信息有错误,无法报销; 公司的行政和财务经常在工作日被问及公司开票信息,影响心情和工作; 引入相应的专业APP来解决发票问题对于一般公司成本较高; 看到朋友孟要早睡写过脚本来解决这个问题,但因为公司场景不相同,无法复用,所以新写了一个 本代码使用简单的封装方法,并做了比较走心的注释,希望能给初学Python的小伙伴提供一些灵感,也能让有实际需求的人可以快速修改、使用。 源码地址: https://github.com/yc2code/WechatInvoiceParser P.S. 工具基于微信网页版,因为微信官方对于账号有限制,新建的账号可能无法使用,会报: KeyError: 'pass_ticket' ,如图: 所以工具只能使用注册时间较早的账号 发票自动校核微信机器人代码部分 1. 工具文件 – Utils 包含三个部分:发票校核类 Invoice、解析数据类 DataParser 和推送日志类 Pushover Invoice 调用的百度API,上传图片信息,得到解析数据; DataParser 对得到的解析数据进行整理,得到发送给用户的信息; Pushover 出现调用问题时,第一时间相关信息推送到维护者的设备上。 # -*- coding: utf-8 -*- # Utils.py import base64 import csv

Spring 如何在一个事务中开启另一个事务?

試著忘記壹切 提交于 2020-08-07 00:28:33
作者:Mazin https://my.oschina.net/u/3441184/blog/893628 这样的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两个方法,也就是将两个操作的事务分开。 但是这只适用与业务比较简单的,如果出现多次数据库的写操作,而我们调用的系统只需要其中一个写操作的最新数据,如果我们将它分开,那么如果调用目标系统出现异常的时候,那么之前的写操作就不能回滚了。 举个简单的例子: @Service public class ServiceA { @Transactional public void doSomething(){ 向数据库中添加数据; 调用其他系统; } } 这里就用伪代码来做示例了,当我们执行了“向数据库中添加数据”,我们去数据库中查询,发现并没有我们添加的数据,但是当我们的 service 这个方法执行完成之后,数据库中就有这条数据了,这是由于数据库的隔离性造成的。 Spring中的事务注解 @transactional 提供了一个参数: Propagation propagation() default Propagation.REQUIRED; 这个参数是定义 **Spring事务的传递性的,默认值为:**required,也就是如果有事务,就加入事务

Ubuntu 18.04 安装微信(Linux通用)

五迷三道 提交于 2020-08-06 19:54:56
Linux相关的知识: https://www.cnblogs.com/dunitian/p/4822808.html#linux 彩色最新版: https://www.cnblogs.com/dotnetcrazy/p/9124658.html 上次有人无意间看见我桌面,然后问微信怎么装的? 其实很简单,有人问,那就说下: 其实这个是一个开源软件,当然了是基于web版的微信。Ubuntu软件市场也是有的,所以安全性不用担心 开源地址: https://github.com/geeeeeeeeek/electronic-wechat 下面介绍几种安装的方式: 1.直接解压运行(推荐1、4、5的方式) 先选择你系统版本: 解压一下: tar -zxvf xxx.tar.gz (基础命令里面是有关解压专题的: https://www.cnblogs.com/dunitian/p/4822807.html ) 算了,还是简单为新手分析一下==》tar命令可以解包. tar 和 . tar . gz 。xxx.tar 的解压命令是 tar -xvf xxx.tar ,那么你记 xxx.tar.gz 解包命令的时候记住红色的g开头,那么推一下==》自然记得了, -zxvf 其实直接运行 electronic-wechat 即可,为了使用方便,我们创建桌面图标:(不能简单的创建链接哦~)

18. 理解Go 语言中的 语句块与作用域

笑着哭i 提交于 2020-08-06 19:39:49
Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客: http://golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 由于 Go 使用的是词法作用域,而词法作用域依赖于语句块。所以在讲作用域时,需要先了解一下 Go 中的语句块是怎么一回事? 1. 显示语句块与隐式语句块 通俗地说,语句块是由花括弧( {} )所包含的一系列语句。 语句块内部声明的名字是无法被外部块访问的。这个块决定了内部声明的名字的作用域范围,也就是作用域。 用花括弧包含的语句块,属于显示语句块。 在 Go 中还有很多的隐式语句块: 主语句块:包括所有源码,对应内置作用域 包语句块:包括该包中所有的源码(一个包可能会包括一个目录下的多个文件),对应包级作用域 文件语句块:包括该文件中的所有源码,对应文件级作用域 for 、if、switch等语句本身也在它自身的隐式语句块中,对应局部作用域 前面三点好理解,第四点举几个例子 for 循环完后,不能再使用变量 i for i := 0; i < 5; i++ { fmt

深度学习中的正则化(一)

こ雲淡風輕ζ 提交于 2020-08-06 12:03:39
本文首发自公众号: RAIS ,点击直接关注。 前言 本系列文章为《Deep Learning》读书笔记,可以参看原书一起阅读,效果更佳。本文我们聊一聊深度学习中的正则化。 深度学习中的正则化 一般来说,深度学习所要做的事情是用已有的训练集训练一个网络模型,然后针对新的数据给出预测,我们期望我们的模型在训练集和测试集上都有良好的表现,但是有的时候两者不可兼得。一种情况是在训练集上表现很好,在测试集上表现不好或表现一般;另一种情况是在训练集上表现不好或表现一般,在测试集上表现很好。相比较而言我们更倾向于后者,因为这是我们训练模型的目的。 为什么会出现这种情况,难道不是应该训练集上表现的越好在测试集上表现越好吗?不是的,我们在前面的文章中分析过,过度的拟合一个训练集往往会放大哪些没有那么重要的向量或因素,过拟合会导致泛化能力的下降,正则化就是为了减小测试误差的,虽然有的时候可能会以增大训练误差为代价,但是这是值得的,这些策略统称为正则化。下面给出一个简单的非严谨的正则化定义: 正则化:减小泛化误差而不是训练误差所做的对算法的修改 我们经常会对估计进行正则化,估计的正则化采取的方式是以偏差的增大来换取方差的减小,尤其是显著的减小方差而较小的增大偏差往往是我们追求的目标。接下来我们就分别分析介绍一下正则化的策略。 正则化的策略 参数范数惩罚 $$ \widetilde{J}(θ; X, y

微服务为什么选Spring Cloud?

≯℡__Kan透↙ 提交于 2020-08-06 08:52:48
现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性。同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术中的翘楚——Spring Cloud。这是序篇,主要讲述我们为什么选择Spring Cloud和它的技术概览。 1、为什么微服务架构需要Spring Cloud 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB、KV,去掉重量级ESB),并且强调DevOps和快速演化。这就要求我们必须采用与一站式时代、泛SOA时代不同的技术栈,而Spring Cloud就是其中的佼佼者。 DevOps是英文Development和Operations的合体,他要求开发、测试、运维进行一体化的合作,进行更小、更频繁、更自动化的应用发布,以及围绕应用架构来构建基础设施的架构。这就要求应用充分的内聚,也方便运维和管理。这个理念与微服务理念不谋而合。 接下来我们从服务化架构演进的角度来看看为什么Spring Cloud更适应微服务架构。点击 这里 查看Spring系列教程集合。 1.1 从使用nginx说起 最初的服务化解决方案是给提供相同服务提供一个统一的域名,然后服务调用者向这个域名发送HTTP请求,由Nginx负责请求的分发和跳转。 这种架构存在很多问题: Nginx作为中间层

Spring Cloud 微服务架构的五脏六腑!

ε祈祈猫儿з 提交于 2020-08-06 05:31:16
来源:kujiale webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件。 注:Spring Boot 简单理解就是简化 Spring 项目的搭建、配置、组合的框架。因为与构建微服务本身没有直接关系,所以本文不对 Spring Boot 进行展开。 另外本文有一些例子涉及到 Spring 和 Spring Boot,建议先了解一下 Spring 和 Spring Boot 再阅读本文。 本文的阅读对象主要是没有接触过服务架构,想对其有一个宏观的了解的同学。 本文将从 Spring Cloud 出发,分两小节讲述微服务框架的「五脏六腑」: 第一小节「服务架构」旨在说明的包括两点,一服务架构是什么及其必要性;二是服务架构的基本组成。为什么第一节写服务架构而不是微服务架构呢?原因主要是微服务架构本身与服务架构有着千丝万缕的关系,服务架构是微服务架构的根基。 第二小节「五脏六腑」则将结合 Spring Cloud 这个特例来介绍一个完整的微服务框架的组成。 「服务架构」 为了方便理解,我先讲一个小故事:(改编自一知乎答主) Martin(微服务提出者也叫 Martin)刚来到公司时是一个基层员工,它上面有经理、老板,那个时候所有人都听老板的指挥。

如何使用 Shell 脚本来查看多个服务器的端口是否打开?

守給你的承諾、 提交于 2020-08-06 04:43:18
我们在进行服务器配置的时候,经常要查看服务器的某个端口是否已经开放。如果服务器只有一两台的话,那很好办,只需要使用 nc 命令一个个查看即可。 但是,如果你的服务器是个集群,有很多台呢?那如果还一个个手动去检查的话,效率肯定是无比低下的,年底裁员名单里肯定有你。 在这种情况下,我们完全可以使用 Shell 脚本配合 nc 命令来达到我们的目的。而且,不管服务器有几台,需要检查的端口有几个,都可以实现这样的目标。 在本文里,我们用 Shell 脚本来实现两个需求: 扫描多台服务器的 一个 端口是否打开 扫描多台服务器的 多个 端口是否打开 在开始之前,我们先来了解一下 nc 命令。 nc 命令简介 nc 是英文单词 netcat 的缩写,它是通过使用 TCP 或 UDP 的网络协议的连接来读或写数据,可以直接被第三方程序或脚本直接调用。 同时,它是一款功能非常强大的网络调试工具,因为它可以创建几乎所有你所需要的连接方式。 nc 工具主要有三种功能模式:连接模式、监听模式、通道模式。它的一般使用格式如下: $ nc [-options] [HostName or IP] [PortNumber] 接下来,我们就用 Shell 脚本结合 nc 命令来实现我们的两个需求。 1. 扫描多台服务器的一个端口是否打开 在这里,我们先把需要查询的所有服务器地址全部放在一个 server-list

我的开发日记(九)

五迷三道 提交于 2020-08-06 03:18:25
昨天由于有个项目上线,所以通了个宵,今早起来比较晚,工作进度又落下来一截,心里更加慌慌了。这两天的主要任务还是搬砖了,只有一个地方值得记一下,就是异步执行测试用例,并收集结果。其中涉及到了线程池的创建,基本多线程对象的设计,多用例并行执行。这里面用到的多个用例如果同时使用同一个用户的登录凭证和用户登录凭证缓存。 我的基本方案如下:先用多线程把用例里面的使用到的用户凭证替换成真正的值,然后再去将处理好的用例信息丢给线程池去执行,然后等待所有的线程执行完,测试结果处理等等。 有好多 TODO 内容,过完端午节补上。 多线程类 package com.okay.family.common; import com.okay.family.common.basedata.OkayConstant; import com.okay.family.common.bean.testcase.CaseRunRecord; import com.okay.family.common.bean.testcase.request.CaseDataBean; import com.okay.family.common.enums.RunResult; import com.okay.family.common.exception.CommonException; import com.okay.family

小程序上传帖子(含有文字图片的微信验证)

丶灬走出姿态 提交于 2020-08-05 23:34:58
public.js var graceJS = require('../../utils/grace.js'); import { config } from '../../config.js' Page({ /** * 页面的初始数据 */ data: { imglist: [], title:'', content:'', }, delImg(e) { let index = e.currentTarget.dataset.index; let array = []; console.log(index); for (var i = 0; i < this.data.imglist.length; i++) { if (i !== index) { array.push(this.data.imglist[i]) } } console.log(array); this.setData({ imglist: array, }) }, upimg() { let that = this var url = config.api_base_url + "upload_pic" wx.chooseImage({ count: 1, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'],